2010-02-01 36 views
6

我應該使用NUnit和最小起訂量 返回真實的。我米的私有方法,所以我有如下:如何聲明/驗證Moq保護方法?

[TestFixture] 
public class CustomerTestFixture 
{ 
    var customerMock=new Mock<ICustomer>() 
    customerMock.Protected().Setup<bool>("CanTestPrivateMethod").Returns(true); 

    // How do I assert it now since I cannot do 
    customerMock.Verify //Verify does not exists. 
} 

無法找到谷歌什麼,告訴你如何對它進行測試。你可以看到我可以爲它做一個設置,但不能斷言。

我是否缺少明顯的?非常感謝。

回答

3

你不想在模擬上測試一個方法。您想要在實際類的實例上測試該方法。上課的test a private method的方法是使用訪問器。請注意,VS會自動爲您提供這些內容,或者您​​可以使用反射來「滾動自己」。對於內部方法,您還可以在AssemblyInfo.cs文件中將InternalsVisibleTo設置爲您的測試項目。

[TextFixture] 
public class CustomerTestFixture 
{ 
    var customer = new Customer(); 
    var accessor = new Customer_Accessor(new PrivateObject(customer)); 

    Assert.IsTrue(accessor.CanTestPrivateMethod()); 

} 

當你模擬一個對象時,意圖是該對象被用作實際被測試類的依賴。因此,能夠設置模擬對象以返回特定值就足夠了。你在使用依賴的類上做斷言,而不是在模擬類上。驗證步驟可確保被測試的類根據您建立的期望調用模擬對象上的方法。

+0

感謝您的回覆。 我想我的模擬了object.CanTestPrivateMethod返回特定的值。 所以,如果我硬編碼「返回true」在我的私人方法。 我仍然可以斷言嗎? 在我看來,我不應該測試私人方法,但我的同事堅持這一個。 所以我只是想弄清楚如何使用起訂量來做到這一點。 – user9969 2010-02-01 19:04:39

+1

你錯過了我的觀點。不要模擬被測物體。只嘲笑它的依賴關係。創建一個實際的實例,設置條件以便私有方法返回一個特定的值,然後使用訪問器檢查該方法是否實際返回該值。唯一需要mock的是如果實例有一些依賴關係,你可以在你的私有方法中使用它們。 – tvanfosson 2010-02-01 19:32:13

+0

感謝您的時間和答覆。我現在明白了。 – user9969 2010-02-01 21:48:13