2009-12-17 38 views
2
方法的內部

很新的這嘲諷的事,我有幾個問題。測試與RhinoMock或起訂量

如果我錯了,請糾正我: Mocking不會初始化真正的方法,即Mocking實際上不會調用您的類的構造函數。相反,它可以像查看類的簽名一樣創建一個具有該簽名的對象,但不具有任何方法功能。如果你只需要這種類型的對象,但不想測試它的內部結構,這很有用。如果你正在測試的對象有依賴關係。

我試圖測試方法的內部,這是否意味着我必須創建,該方法屬於類的實例?

+1

你正在做什麼和你想要達到什麼樣的代碼示例將有助於 – roundcrisis 2009-12-17 11:14:56

回答

7

摘要:動態模擬不會幫助你測試類型的內部,但你不應該試圖做到這一點。


你的描述基本上是正確的,但比這更復雜一點。從本質上講,動態模擬考試沒有做任何事情,你不能用手做。

比方說,你是編程對接口比如這個:

public interface IMyInterface 
{ 
    string Foo(string s); 
} 

您可以手動創建一個特定測試的實現IMyInterface的中忽略輸入參數,並始終返回相同的輸出:

public class MyClass : IMyInterface 
{ 
    public string Foo(string s) 
    { 
     return "Bar"; 
    } 
} 

但是,如果您想測試消費者如何響應不同的返回值,那麼這會變得非常快速,因此您可以不用手動編碼Test Doubles一個框架動態地爲你創建它們。

試想一下,動態模擬真寫類似於上面的MyClass的實現代碼(它們實際上並不寫代碼,他們動態發出的類型,但它是足夠準確的比喻)。

這裏是你如何能定義與起訂量相同的行爲MyClass的:

var mock = new Mock<IMyInterface>(); 
mock.Setup(x => x.Foo(It.IsAny<string>())).Returns("Bar"); 

在這兩種情況下,在創建對象時創建的類的construcor將被調用。由於接口沒有構造函數,因此它通常是默認構造函數(分別爲MyClass和動態發佈的類)。

你可以做具體的類型相同,如這一個:

public class MyBase 
{ 
    public virtual string Ploeh() 
    { 
     return "Fnaah"; 
    } 
} 

通過手,你就可以從MyBase派生並重寫Ploeh方法,因爲它是虛擬的:

public class TestSpecificChild : MyBase 
{ 
    public override string Ploeh() 
    { 
     return "Ndøh"; 
    } 
} 

動態模擬庫可以做同樣的事情,抽象方法也是如此。在這種情況下,基類的構造函數被調用,因爲這是.NET是如何工作的。

但是,也可以不寫重寫非虛擬或內部構件,並且既不罐動態嘲笑代碼。他們只能做你能做的事情。

一條建議,但:只有通過您的公共API單元測試內部成員。

警告:以上描述對於大部分動態模擬都是正確的,但TypeMock除外,這是不同的和...可怕的。