我一直在使用 moles 对代码中难以触及的部分编写单元测试——特别是在我使用 sitecore 类库中的类型(这些类型很难与模拟框架一起使用)的情况下。我遇到了一个令人惊讶的棘手问题,我正在尝试使用 LinkField 类型并测试以下类型的代码片段。
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 类型的mole,并将其分配给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。
有没有人有更好的主意?这听起来非常令人费解,但我认为这是拥有这些组件的野兽的本性。