使用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模拟对象中。
任何想法都会受到赞赏。
答案 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数据吗?