我目前正在对一些调用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);
}
}
}
非常感谢任何帮助。
答案 0 :(得分:1)
您应该区分Sitecore Database
和FakeDb Db
类。在生产装配中,您肯定需要第一个(并且只有第一个)。仅用于单元测试需要FakeDb Db
类。
在Sitecore 8.2之前,Sitecore.Data.Database
类是静态的,并且无法在单元测试中模拟它。 using new Db()
语句允许以允许您使用标准Sitecore API创建和检索测试内容的方式配置内存中数据提供程序。您应该始终牢记有两种API。
在您的示例中,可以通过db.Database
属性
var database = db.Database;
myClass myclass = myClass(database);
从Sitecore 8.2开始,静态Database
类已分为抽象Database
和具体DefaultDatabase
类。这使得数据库模拟而不用 FakeDb。