使用 Sitecore FakeDb 模拟 Sitecore 数据库

Mocking Sitecore Database using Sitecore FakeDb

我目前正在对一些调用 sitecore 数据库的方法进行单元测试。 class 具有 Sitecore 数据库的属性并使用它来获取项目。我正在考虑使用 Sitecore FakeDb 来模拟这些项目。有什么方法可以让我使用 Sitecore FakeDb 来测试这些方法吗?

public class myClass
{
    private Database myDb;

    public string getMyItemValue()
    {
        var myItem = myDb.GetItem(SomeID);
        string myItemValue = myItem["value"];

        return myItemValue;
    }
}

我还为 class

创建了一个构造函数
public myClass(myDatabase)
{
    myDb = myDatabase;
}

现在在单元测试中,我正在尝试使用 Sitecore FakeDB。我尝试使用从 link https://github.com/sergeyshushlyapin/Sitecore.FakeDb 中获得的基本 FakeDb 信息。将 FakeDb 参数传递给 class 时代码中断,因为它不是数据库。顺便说一句,我正在使用 Xunit。

public class myClassTests
{
    [Fact]
    public void myItemValueTest()
    {
        using (var db = new Db
        {
          new DbItem("myItem") { { "value", "hello world!" } }
        }){
            myClass myclass = myClass(db); /*code breaks here*/

            string myItemValue = myclass.getMyItemValue();
            Assert.Equal("hello world!", myItemValue);
        }
    }
}

如有任何帮助,我们将不胜感激。

你应该区分 Sitecore Database 和 FakeDb Db classes。在生产装配中,您肯定需要第一个(而且只需要第一个)。 FakeDb Db class 仅用于单元测试目的。

在 Sitecore 8.2 之前,Sitecore.Data.Database class 是静态的,无法在单元测试中对其进行模拟。 using new Db() 语句允许以允许您使用标准 Sitecore API 创建和检索测试内容的方式配置 内存中 数据提供程序。您应该始终牢记有两种 API.

在您的示例中,可以通过 db.Database 属性:

访问 Sitecore 数据库
var database = db.Database;
myClass myclass = myClass(database);

从 Sitecore 8.2 开始,静态 Database class 已拆分为抽象 Database 和具体 DefaultDatabase classes。这使得数据库模拟 没有 FakeDb.