使用Sitecore和FakeDB进行单元测试 - 项目

时间:2015-10-10 01:32:59

标签: c# unit-testing sitecore

我正在尝试使用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无法完全删除字段。在我的评论中,您可以看到字段的位置,因此最初设置它们。但是,当通过存储库界面时,它们就会消失。

任何人都可以帮助发现此错误吗?

3 个答案:

答案 0 :(得分:1)

您是否尝试为_someItemTemplateId添加DbTemplate?我不确定FakeDb如何实现它,但是,使用sql提供程序,如果在模板上找不到字段,则不会保存这些值。

答案 1 :(得分:0)

使用FakeDb时,我总是在Asserts语句中执行using。您应该检查IDisposable是否没有撕毁您的FakeDb项目。

答案 2 :(得分:0)

嘿,您可以结帐模板inheritance部分,并确保您正确获取该项目。