C# 使用Sitecore和FakeDB进行单元测试-项上的字段值丢失
我正在尝试使用NUnit和Moq对FakeDB设置运行单元测试。sitecore查询是通过我正在模拟的接口进行抽象的。当我最初调用查询时,它会正确地创建带有字段值的项。当调用存储库的测试方法使用查询结果时,字段值会突然消失 我缩短了测试并将其放入此文件中。它的最低运行要求是:C# 使用Sitecore和FakeDB进行单元测试-项上的字段值丢失,c#,unit-testing,sitecore,C#,Unit Testing,Sitecore,我正在尝试使用NUnit和Moq对FakeDB设置运行单元测试。sitecore查询是通过我正在模拟的接口进行抽象的。当我最初调用查询时,它会正确地创建带有字段值的项。当调用存储库的测试方法使用查询结果时,字段值会突然消失 我缩短了测试并将其放入此文件中。它的最低运行要求是: 使用系统; 使用FluentAssertions; 使用最小起订量; 使用NUnit.Framework; 使用Sitecore.Data; 使用Sitecore.Data.Items; 使用Sitecore.FakeD
使用系统;
使用FluentAssertions;
使用最小起订量;
使用NUnit.Framework;
使用Sitecore.Data;
使用Sitecore.Data.Items;
使用Sitecore.FakeDb;
命名空间NYL.UnitTests.FakeDB
{
[测试夹具]
公共类FakeDbFieldValueTest
{
私有只读Mock_repo=new Mock();
私有只读ID _someItemTemplateId=ID.NewID;
[设置]
公共作废设置()
{
//database=FakeDatabase();
_repo.Setup(m=>m.GetListOfItems()).Returns(Mock_GetListOfItems());
}
[测试]
公共无效测试\u FakeDbFieldRetention()
{
//安排
var items=_repo.Object.GetListOfItems();
//断言
items.Should().NotBeNull();
items.Should().HaveCount(3);
foreach(项目中的var项目)
{
//通过模拟传回后,字段为空
item.Fields[“Some Field”].Should().NotBeNull();
项[“某些字段]。应()。不完全空();
}
}
私有IDisposable伪造数据库()
{
返回新数据库
{
新项目(“主页”)
{
new DbItem(“第一个子项”,ID.NewID,\u someItemTemplateId)
{
{“某个字段”,“值一”}
},
新的DbItem(“第二个子项”,ID.NewID,_someItemTemplateId)
{
{“某些字段”,“值二”}
},
新DbItem(“第三个子项”,ID.NewID,\u someItemTemplateId)
{
{“某些字段”,“值三”}
}
}
};
}
私有项[]Mock_GetListOfItems()
{
使用(FakeDatabase())
{
var query=string.Format(“fast:/sitecore/content/Home/*[@@templateid='{0}']”,_someItemTemplateId);
var items=Sitecore.Context.Database.SelectItems(查询);
foreach(项目中的var项目)
{
//字段值在创建时渲染良好
item.Fields[“Some Field”].Should().NotBeNull();
项[“某些字段]。应()。不完全空();
}
退货项目;
}
}
}
公共接口假定
{
项目[]GetListOfItems();
}
}
方法Test\u FakeDbFieldRetention
失败得惊人,字段被完全删除。在我的评论中,您可以看到字段的位置,因此它们最初是被设置的。但是,当通过存储库接口时,它们就消失了
有人能帮你发现这个错误吗?你试过为
\u someItemTemplateId添加一个吗?我不确定FakeDb是如何实现它的,但使用sql提供程序,如果在模板上找不到字段,则不会保存值。使用FakeDb时,我总是在中使用语句执行断言。您应该检查IDisposable
是否没有删除您的伪造数据库项目。嘿,您可以签出模板部分,并确保正确获取项目 为什么要这么复杂。创建一个具有某些属性的类,并创建该类的一个列表,然后在调用服务后在返回语句中传递该类列表。这将是模拟的。从单元测试的角度来看,这个问题没有多大意义?你想测试什么?它似乎从来没有调用任何逻辑?没有点单元测试DB。您所有的测试都是DB处于x状态(您已经知道),一旦该状态发生变化,单元测试将无法实现任何功能。单元测试应该复制一个状态来测试逻辑。我想你已经掌握了一些东西。我正在玩它,没有得到任何结果-但它可能是在我的impl。下面是我的数据库的外观(当然缩短了)新数据库{new DbTemplate(“Child Tpl”),{u someItemTemplateId){new DbField({u itemFieldName,{u someFieldId)},new DbItem(“Home”){new DbItem(“First Child”,ID.NewID,{u someItemTemplateId){{{u itemFieldName,“Value One”},这实际上非常有效,但在实际的代码库中,测试实际上要复杂得多。为了解决这个问题,我对它进行了精简。它仍然需要对通过查询提取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();
}
}