使用Sitecore FakeDb模拟Sitecore数据库

时间:2017-05-22 06:56:18

标签: c# unit-testing sitecore

我目前正在对一些调用sitecore数据库的方法进行单元测试。该类具有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;
    }
}

我还为类

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

现在在单元测试中我正在尝试使用Sitecore FakeDB。我尝试使用从此链接railscast获得的基本FakeDb信息。将FakeDb参数传递给类时,代码会中断,因为它不是数据库。我顺便使用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);
        }
    }
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

从Sitecore 8.2开始,静态Database类已分为抽象Database和具体DefaultDatabase类。这使得数据库模拟而不用 FakeDb。