我正在尝试使用NUnit和Moq对FakeDB设置运行单元测试。 sitecore查询正在通过我正在模拟的界面进行抽象。当我最初调用查询时,它正确地创建具有字段值的项目。当调用存储库的测试方法使用查询结果时 - 字段值突然消失。
我缩短了测试并将其放入此文件中。它有最低限度运行:
using System;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.FakeDb;
namespace NYL.UnitTests.FakeDB
{
[TestFixture]
public class FakeDbFieldValueTest
{
private readonly Mock<IRepository> _repo = new Mock<IRepository>();
private readonly ID _someItemTemplateId = ID.NewID;
[SetUp]
public void SetUp()
{
//database = FakeDatabase();
_repo.Setup(m => m.GetListOfItems()).Returns(Mock_GetListOfItems());
}
[Test]
public void Test_FakeDbFieldRetention()
{
// arrange
var items = _repo.Object.GetListOfItems();
// assert
items.Should().NotBeNull();
items.Should().HaveCount(3);
foreach (var item in items)
{
// Fields are null after passed back through mock
item.Fields["Some Field"].Should().NotBeNull();
item["Some Field"].Should().NotBeNullOrEmpty();
}
}
private IDisposable FakeDatabase()
{
return new Db
{
new DbItem("Home")
{
new DbItem("First Child", ID.NewID, _someItemTemplateId)
{
{"Some Field", "Value One"}
},
new DbItem("Second Child", ID.NewID, _someItemTemplateId)
{
{"Some Field", "Value Two"}
},
new DbItem("Third Child", ID.NewID, _someItemTemplateId)
{
{"Some Field", "Value Three"}
}
}
};
}
private Item[] Mock_GetListOfItems()
{
using (FakeDatabase())
{
var query = string.Format("fast:/sitecore/content/Home//*[@@templateid = '{0}']", _someItemTemplateId);
var items = Sitecore.Context.Database.SelectItems(query);
foreach (var item in items)
{
// Field Values render fine at creation
item.Fields["Some Field"].Should().NotBeNull();
item["Some Field"].Should().NotBeNullOrEmpty();
}
return items;
}
}
}
public interface IRepository
{
Item[] GetListOfItems();
}
}
方法Test_FakeDbFieldRetention
无法完全删除字段。在我的评论中,您可以看到字段的位置,因此最初设置它们。但是,当通过存储库界面时,它们就会消失。
任何人都可以帮助发现此错误吗?
答案 0 :(得分:1)
您是否尝试为_someItemTemplateId
添加DbTemplate
?我不确定FakeDb如何实现它,但是,使用sql提供程序,如果在模板上找不到字段,则不会保存这些值。
答案 1 :(得分:0)
使用FakeDb时,我总是在Asserts
语句中执行using
。您应该检查IDisposable
是否没有撕毁您的FakeDb项目。
答案 2 :(得分:0)
嘿,您可以结帐模板inheritance部分,并确保您正确获取该项目。