gpt4 book ai didi

c# - 如何有效测试 SiteCore LinkField

转载 作者:太空狗 更新时间:2023-10-30 01:22:35 26 4
gpt4 key购买 nike

我一直在使用 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 的地鼠,并将其分配给 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。

有没有人有更好的主意?这听起来非常令人费解,但我认为这就是这些装配体的本性。

最佳答案

这是可以做到的,但您需要跳过几个环节才能使其发挥作用。

首先,一些背景:

  • LinkField 不像其他一些字段类型那样继承自 Field 类。
  • LinkField 继承自 XmlField,后者又继承自 CustomField。
  • CustomField(及其子类型)通过将字段实例传递给构造函数来实例化。
  • Linkfield 将其值存储在此字段实例中。
  • Linkfield 不能添加到 FieldCollection,因为它们不是从 Field 继承的。
  • 我们不需要添加 LinkField,而是添加 LinkField 的 InnerField 属性。
  • 当从 FieldCollection 中提取 Field 并将其分配给 LinkField 时,将执行隐式转换操作。
  • 隐式转换操作通过将所选字段传递给 LinkField 的构造函数来创建一个新的 LinkField。返回的就是这个新的 LinkField。

现在一些代码:

const string externalUrl = "External Url";
const string targetItemName = "Target Item";
Field field = new ShimField { IDGet = () => ID.NewID, NameGet = () => externalUrl };
Item targetitem = new ShimItem { IDGet = () => ID.NewID, NameGet = () => targetItemName };
LinkField linkfield = new ShimLinkField(field) { IsInternalGet = () => true, TargetItemGet = () => targetitem };
ShimLinkField.ImplicitOpFieldLinkField = (f) => linkfield;
FieldCollection fields = new ShimFieldCollection { ItemGetString = (name) => linkfield.InnerField };
Item item = new ShimItem { NameGet = () => "Test Item", FieldsGet = () => fields };

现在进行一些解释:

使上述代码工作的关键是这一行:

ShimLinkField.ImplicitOpFieldLinkField = (f) => linkfield;

通过 Shimming 隐式转换运算符,我们可以确保在调用以下行时:

LinkField linkField = item.Fields["External Url"];  

返回一个链接字段,并根据需要填充它的属性。

关于c# - 如何有效测试 SiteCore LinkField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13235692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com