使用Sitecore和FakeDB,您如何设置LookupField TargetItem?

时间:2016-04-05 00:54:15

标签: c# unit-testing sitecore nunit

使用FakeDB,如何在DbLinkField中设置TargetItem的值?

设置: 我有一个数据模板,其中包含一个指向其他项目列表的下拉列表。

我有一个Sitecore项目扩展方法:

public static Item Lookup(this Item item, string fieldName)
{
    if (item == null) throw new ArgumentNullException("item");
    LookupField field = item.Fields[fieldName];
    if (field == null) return null;
    return field.TargetItem;
}

单元测试和结果: 当我对我的代码运行以下简单测试时,LookupItem被发现为一个字段,但生成的LookupItem有一个null的TargetItem。是否可以使用FakeDB以某种方式模拟这个?

[Test]
public void TestLookupItemExtension()
{
    ID templateId = ID.NewID;
    ID refItemId = ID.NewID;

    using (var db = new Db()
    {
        new DbTemplate("ItemTpl", templateId) { "Foo" },
        new DbItem("RefItem", refItemId),
        new DbItem("ItemComponent", ID.NewID, templateId)
        {
            new DbLinkField("Foo") { TargetID = refItemId  }
        }
    })
    {
        var item = db.GetItem("/sitecore/content/itemcomponent");
        var lookupItem = item.Lookup("Foo");
        lookupItem.Should().NotBeNull();
    }
}

targetitem中字段的结果如下所示:

field   {Sitecore.Data.Fields.LookupField}  Sitecore.Data.Fields.LookupField
+       InnerField  "Foo"-{{C906FD3D-C5DA-4191-8F0A-F15603FB897E}}  Sitecore.Data.Fields.Field
+       TargetID    {{00000000-0000-0000-0000-000000000000}}    Sitecore.Data.ID
+       TargetItem  null    Sitecore.Data.Items.Item
        Value   "<link />"  string
+       _innerField "Foo"-{{C906FD3D-C5DA-4191-8F0A-F15603FB897E}}  Sitecore.Data.Fields.Field

所以我让LookupField正确,但它实际上从未将TargetId或TargetItem放入生成的LookupField模拟对象中。

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

我认为问题在于您正在混合使用LinkField和LookupField。 在测试中,您应该将“Foo”定义为LookupField。像这样:

var field = new DbField("Foo") { Type = "Lookup" };
field.Value = refItemId.ToString();
var dbItem = new DbItem("ItemComponent", ID.NewID, templateId)
                     {
                        field
                     };
db.Add(dbItem);

不确定是否需要这种类型,但这对我有用。

答案 1 :(得分:0)

if(item == null)抛出新参数。

你试过吗?

if(!empty($ item)){}

在进入查阅字段之前,可能会将长ifs更改为更简单的变量。

你能在这里使用js进行异步文件调用吗?它来自json数据吗?