【发布时间】:2012-10-25 12:00:37
【问题描述】:
我一直在使用 moles 对代码中难以触及的部分编写单元测试——尤其是在我使用 sitecore 类库中的类型(这些类型很难与 mocking 框架一起使用)的情况下。我遇到了一个令人惊讶的棘手问题,我正在尝试使用 LinkField 类型并测试以下类型的代码 sn-p。
LinkField linkField = item.Fields["External Url"];
if (linkField.IsInternal && linkField.TargetItem != null)
{
// want to test this path
item.Fields 是一个字段集合,其索引器返回 SiteCore.Data.Field 类型,但 LinkField 设置为使用隐式运算符隐藏转换,这意味着您可以使用 LinkField 的实例你的代码。
我的困难是我无法创建 MLinkField 类型的摩尔,并将其分配给 Item 中的 FieldCollection,因为它是强类型的 Field。此外,似乎虽然我能够创建一种 MField,但当隐式转换发生时,它将工作并返回一个对象,但没有一个字段被设置为具有任何值。这意味着,我无法测试上面的代码路径,它依赖于以某种方式设置的 linkField 的状态。
我能想到设置这些值的唯一方法是间接的——即通过分析隐式转换并在 MField 中设置这些值来找到需要设置的值。隐式运算符调用 LinkField 构造函数如下:
public LinkField(Field innerField) : base(innerField, "link")
这意味着我需要注意它如何实例化基类型 (XmlField),以及该类的基类型 (CustomField)。 然后,查看 TargetItem 正在寻找的基础值。最终结果是需要淘汰:
InnerField.Database.Items[internalPath];
或者
InnerField.Database.Items[targetID];
InnerField 实际上是我的 MField。
有人有更好的主意吗?这听起来非常令人费解,但我认为这就是拥有这些组件的野兽的本性。
【问题讨论】:
标签: c# sitecore sitecore6 moles