![](/img/trans.png)
[英]What's a good way to write Unit tests for code with protected objects C# (using NMock, and NUnit framework)
[英]Unit testing levels of classes with Nunit and Nmock
我有一些類和接口,分別是Level1
, Level2
和Level3
。
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";
}
}
現在,我可以在隔離模擬Level2
接口中進行單元測試類Level1
,並在隔離模擬Level3
接口中進行單元測試類Level2
。 我正在使用Nunit
作為測試框架,並使用NMock
作為模擬框架。
到現在為止還挺好。
但是,是否可以僅對模擬Level3
接口而不對Level2
Level3
對前兩個代碼級別進行單元測試? 我的意思是我想在不模擬Level2
而是模擬Level3
情況下對類Level1
進行單元測試。 我之所以想這樣做,是因為Level3
類從數據庫中獲取數據,並且我只希望模擬該數據庫層,以便我的整個項目只能與模擬db一起使用,而不能與真實數據庫一起使用。
很簡單:
// 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
我認為這是一個集成測試。 此時所有類是否都在同一程序集中並不重要。 集成測試不一定涉及將某些程序集整合到測試中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.