2011-01-06 29 views
4

在回答這個問題here喬恩斯基特回答:>>獨立實例和闡述基於接口的編程

您可以通過嘲弄真的很方便的測試(而不必mock類,它得到醜陋)

我希望通過闡述這個方面的獨立示例更好地理解...... C#中之前(醜陋)和後(基於接口)場景。

並且還,另外,如果是.NET Framework BCL本身的一個例子將是巨大的

回答

3

說你有這個方法從文件讀取的所有的人的名字:

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)); 

寫一個文件到文件系統之前測試聽起來不像設置的很多,但如果你運行了很多的測試,它變得一團糟。通過使用接口和模擬,所有設置都在您的測試方法中進行。

0

如果您重構現有代碼,模仿類可能會變得很難看。想象一下,一個類:

public class A 
{ 
    private B _instanceOfB; 

    public void DoSomethingWithInstanceOfB() 
    { 
     // do something with _instanceOfB 
    } 
} 

如果你想嘲笑A,你不僅需要提取整個代碼的接口和重構 - 但你很可能需要開始嘲諷B中好。在企業環境中,可能無限次地這樣。一個具體的例子可能是如果B是一個類來管理像資料庫這樣的資源。