Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用SitecoreFakeDb开始Sitecore单元测试_C#_Unit Testing_Sitecore - Fatal编程技术网

C# 如何使用SitecoreFakeDb开始Sitecore单元测试

C# 如何使用SitecoreFakeDb开始Sitecore单元测试,c#,unit-testing,sitecore,C#,Unit Testing,Sitecore,我试图找到正确的方法来开始单元测试下面的代码: public class NameUtility { private readonly string _folder = Settings.GetSetting("FolderId"); public ISitecoreDatabase Database {get;set;} = new SitecoreDatabase(); public virtual Path FindById(long Id) {

我试图找到正确的方法来开始单元测试下面的代码:

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);
    }
}
所以我有几个问题,我会先解释一下我的思考过程
FindById
当前依赖于
Sitecore.Context.Database
,它不适用于单元测试,因此我们改用SitecoreFakeDb。我还没有实现GetItem方法,但是我的想法是使用该项设置一个SitecoreFakeDb实例,然后CUT应该能够通过id获取该项

1) 然而,为了测试这段代码,我需要能够用FakeDb的实例替换Sitecore.Context.Database。为此,我创建了
ISitecoreDatabase
,然后它有
GetItem()
等方法以及默认(实际)Sitecore数据库和FakeDb将实现的所有重载。这个接口会有多少方法,这难道不会开始失控吗


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
}
private Mock MyItemInDatabaseModel{get;set;};
[测试初始化]
公共作废设置()
{
var mockSitecoreContext=new Mock();
this.MyItemInDatabaseModel=new Mock();
this.MyItemInDatabaseModel.SetupAllProperties();

mockSitecoreContext.Setup(sc=>sc.getItem您不必替换数据库,因为您已经将其抽象到一个接口后面。您可以像单元测试中预期的那样轻松地模拟接口以进行预成型。至于接口,它不必具有所有重载。只需要所需的。您应该只公开所需的内容。请提供一个简短的片段/示例,说明你在第一句话中的意思?你应该在堆栈交换上提出同样的问题。
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
}