gpt4 book ai didi

c# - 如何开始使用 SitecoreFakeDb 进行 Sitecore 单元测试

转载 作者:太空宇宙 更新时间:2023-11-03 15:11:55 26 4
gpt4 key购买 nike

我正在尝试找到开始对下面的代码片段进行单元测试的正确方法:

public class NameUtility
{
private readonly string _folder = Settings.GetSetting("FolderId");
public ISitecoreDatabase Database {get;set;} = new SitecoreDatabase();

public virtual Path FindById(long Id)
{
var folder = Database.GetItem(new ID(_folder));
var items = folder.GetChildren().Select(child => child.GlassCast<Path>());
return paths.SingleOrDefault(path => path.PathId == Id);
}
}

我对单元测试还很陌生,所以我选择了我能找到的最简单的实用程序来进行测试。这是我的单元测试的开始:

[TestFixture]
public class NameUtilityTests
{
[Test]
public void FindById_WithId_ReturnsPath()
{
var nameUtility = new NameUtility();
nameUtility.Database = new FakeSitecoreDatabase();

var path = nameUtility.FindById(1);

Assert.AreEqual(1, path.PathId);
}

internal class FakeSitecoreDatabase : ISitecoreDatabase
{
public Item GetItem(ID id)
{
throw new System.NotImplementedException();
}
}
}

//Code below is from the Code Under Test assembly.
public interface ISitecoreDatabase
{
Item GetItem(ID id);
}

public class SitecoreDatabase : ISitecoreDatabase
{
private readonly Database _database;

public SitecoreDatabase()
{
_database = Sitecore.Context.Database;
}

public SitecoreDatabase(Database database)
{
_database = database;
}

public Item GetItem(ID id)
{
return _database.GetItem(id);
}
}

所以我有几个问题,我将首先解释我的思考过程。 FindById 目前依赖于 Sitecore.Context.Database,它不适用于单元测试,因此我们改用 SitecoreFakeDb。我还没有实现 GetItem 方法,但我的想法是我使用项目设置 SitecoreFakeDb 的实例,然后 CUT 应该能够通过 ID 获取项目。

1) 但是,为了测试此代码,我需要能够用 FakeDb 的实例替换 Sitecore.Context.Database。为此,我创建了 ISitecoreDatabase,然后它具有 GetItem() 之类的方法及其默认(实际)Sitecore 数据库将实现的所有重载以及 FakeDb .就接口(interface)的方法数量而言,这不会开始失控吗?

2) 当针对最终对象进行断言时,在这种情况下,我断言返回的对象具有与我期望的相同 Id 的字段。这是一种有效的方法,还是将整个实际对象与预期对象进行比较的更好方法?

最佳答案

适用于单元测试 Sitecore 的一个选项是使用模拟框架,例如 Moq。

通过这样做,您可以明确地设置每个单元测试只测试适用于您需要测试的项目。这使您不必完全设置数据库,并允许您只测试每个单元测试中应该测试的内容。

这是一个如何编写测试的示例。

private Mock<IMyItemInDatabase> MyItemInDatabaseModel { get; set; };

[TestInitialize]
public void Setup()
{
var mockSitecoreContext = new Mock<ISitecoreContext>();
this.MyItemInDatabaseModel = new Mock<IMyItemInDatabase>();

this.MyItemInDatabaseModel.SetupAllProperties();

mockSitecoreContext.Setup(sc =>sc.GetItem<IMyItemInDatabase
(It.IsAny<string>(), false, false)).
Returns(this.MyItemInDatabaseModel.Object);
}

[TestMethod]
public void MyItemInDatabaseModel_Should_Not_Be_Null()
{
//....perform unit test here
}

关于c# - 如何开始使用 SitecoreFakeDb 进行 Sitecore 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40809986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com