2013-02-25 106 views
8

嗨我是Moq測試新手,很難做一個簡單的斷言。 我使用的接口Moq測試void方法

public interface IAdd 
{ 
    void add(int a, int b); 
} 

起訂量爲IAdd接口:

Mock<IAdd> mockadd = new Mock<IAdd>(); 
    mockadd.Setup(x => x.add(It.IsAny<int>(), It.IsAny<int>()).callback((int a, int b) => { a+b;}); 
    IAdd testing = mockadd.Object; 

由於add方法是無效的,它不返回任何值一起斷言。我怎樣才能斷言這個設置?

+2

你想要測試什麼? – GolfWolf 2013-02-25 07:59:16

+0

我想測試該添加方法,但它沒有任何返回類型。如果它有int作爲返回類型,我將測試Assert.AreEqual(mockadd.add(2,2),4);但是沒有返回類型,我如何測試add方法。 – 2013-02-25 08:03:47

+2

** 1。**測試接口(或模擬實現)是沒有意義的。 ** 2。**如果你有一個類來計算某些東西,你可能希望以某種方式使結果可用(通過返回值或該對象的某個屬性) – GolfWolf 2013-02-25 08:34:14

回答

14

更好地提供更多的背景,但通常使用的是這樣的:

var mockAdd = new Mock<IAdd>(); 
mockAdd.Setup(x => x.Add(1, 2)).Verifiable(); 

//do something here what is using mockAdd.Add 

mockAdd.VerifyAll(); 
+0

Pavel,你能解釋一些關於//在這裏做些什麼的地方是什麼使用mockAdd.Add。我被困在一個類似的問題,不知道要添加什麼「/ /在這裏做什麼是什麼使用mockAdd.Add」 – Maddy 2017-12-05 00:37:34

18

爲什麼用於嘲諷?它用於驗證SUT(被測系統)與其依賴性(應該被嘲笑)正確交互。正確的交互意味着使用正確的參數調用正確的依賴成員。

您應該從不斷言模擬返回的值。這是與生產代碼無關的虛擬價值。您應該斷言的唯一值是由SUT返回的值。 SUT是你唯一應該寫斷言的東西。

你也應該從來沒有測試接口。因爲沒有什麼可以測試的。接口只是一個API描述。它沒有實現。那麼,停下來想想你在這裏測試的代碼是什麼?這是一個真實的代碼,在您的應用程序中執行?

所以,你應該模擬IAdd接口只適用於使用IAdd接口的測試對象。

+0

嗨,謝爾蓋,我是在這個模擬測試新。我想避免無效方法執行,該方法更新數據庫,是否是一個更好的方法呢? – 2017-01-26 18:52:19