使用Nunit和Nmock对类进行单元测试

时间:2013-09-18 04:58:48

标签: c# nunit nmock

我有类和接口的级别,即Level1Level2Level3
班级Level1取决于班级Level2,班级Level2取决于班级Level3

以下是该设计的代码:

public interface ILevel1
{
    string GetData();
}

public class Level1 : ILevel1
{
    ILevel2 level2;
    public Level1(ILevel2 level2)
    {
        this.level2 = level2;
    }

    public string GetData()
    {
        // some more process on data.
        var data = level2.GetDataAndProc();
        data = data + ",Proc at Level1";
        return data;
    }
}

public interface ILevel2
{
    string GetDataAndProc();        
}

public class Level2 : ILevel2
{    
    ILevel3 level3;
    public Level2(ILevel3 level3)
    {
        this.level3=level3;
    }

    public string GetDataAndProc()
    {
        var data=level3.GetDataFromDB();
        // processing on the data from db.
        data=data+ " Processed at level2";
        return data;
    }
}

public interface ILevel3
{
    string GetDataFromDB();
}

public class Level3 : ILevel3
{
   public string GetDataFromDB()
   {
       // Functionalities to get data from db.
       return "DB Data";
   }
}

现在,我可以在隔离模拟Level1接口的隔离模拟Level2接口和单元测试类Level2中单元测试类Level3。我使用Nunit作为测试框架,NMock作为模拟框架。

到目前为止一切顺利。

但是,我可以单独测试前两级代码仅模拟Level3界面而不模仿Level2 吗?我的意思是我想在不模仿Level1但是嘲笑Level2的情况下对测试类Level3进行单元化。我想这样做是因为Level3类从数据库中获取数据,我想只模拟这个数据库层,这样我的整个项目就可以使用模拟数据库,而不是真正的数据库。

1 个答案:

答案 0 :(得分:0)

这很简单:

// arrange
var mocks = new Mockery();
var mockLevel3 = mocks.NewMock<ILevel3>();
// now do some actual mocking here

var level2 = new Level2(mockLevel3);
var level1 = new Level1(level2);

// now do some act and assert stuff

在我看来,这是一次集成测试。如果所有类都在同一个程序集中,则此时无关紧要。集成测试不一定是在测试中将某些组件集合在一起。