Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Sitecore和FakeDB进行单元测试-项上的字段值丢失_C#_Unit Testing_Sitecore - Fatal编程技术网

C# 使用Sitecore和FakeDB进行单元测试-项上的字段值丢失

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

我正在尝试使用NUnit和Moq对FakeDB设置运行单元测试。sitecore查询是通过我正在模拟的接口进行抽象的。当我最初调用查询时,它会正确地创建带有字段值的项。当调用存储库的测试方法使用查询结果时,字段值会突然消失

我缩短了测试并将其放入此文件中。它的最低运行要求是:

使用系统;
使用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();
    }
}