在回答這個問題here喬恩斯基特回答:>>獨立實例和闡述基於接口的編程
您可以通過嘲弄真的很方便的測試(而不必mock類,它得到醜陋)
我希望通過闡述這個方面的獨立示例更好地理解...... C#中之前(醜陋)和後(基於接口)場景。
並且還,另外,如果是.NET Framework BCL本身的一個例子將是巨大的
在回答這個問題here喬恩斯基特回答:>>獨立實例和闡述基於接口的編程
您可以通過嘲弄真的很方便的測試(而不必mock類,它得到醜陋)
我希望通過闡述這個方面的獨立示例更好地理解...... C#中之前(醜陋)和後(基於接口)場景。
並且還,另外,如果是.NET Framework BCL本身的一個例子將是巨大的
說你有這個方法從文件讀取的所有的人的名字:
string[] GetNamesFrom(string path) { }
要測試此方法,您必須提供現有文件的路徑名,這需要進行一些設置。
與此相比,這種方法:
string[] GetNamesFrom(IFile file)
如果IFile
包含GetContents()
方法,那麼你的「真正」實現這個接口可以訪問文件系統,你的模擬類可以簡單地返回測試輸入數據。
使用像MOQ一個模擬庫(http://code.google.com/p/moq/)這變得很簡單:
var fileMock = new Mock<IFile>();
fileMock.Setup(f => f.GetContents()).Returns(testFileContents));
Assert.Equals(expectedNameArray, GetNamesFrom(fileMock.Object));
寫一個文件到文件系統之前測試聽起來不像設置的很多,但如果你運行了很多的測試,它變得一團糟。通過使用接口和模擬,所有設置都在您的測試方法中進行。
如果您重構現有代碼,模仿類可能會變得很難看。想象一下,一個類:
public class A
{
private B _instanceOfB;
public void DoSomethingWithInstanceOfB()
{
// do something with _instanceOfB
}
}
如果你想嘲笑A,你不僅需要提取整個代碼的接口和重構 - 但你很可能需要開始嘲諷B中好。在企業環境中,可能無限次地這樣。一個具體的例子可能是如果B是一個類來管理像資料庫這樣的資源。