2012-03-29 128 views
4

我正在注入一個依賴項CheckCompatibRepository。我在嘲笑一個方法IsCompatible,它有一個列表作爲第三個參數。模擬一個帶參數的方法

var mockRepositoryCheckCompatib = new Mock<ICheckCompatibilityActDoer>(); 
      mockRepositoryCheckCompatib.Setup(c => c.IsCompatible(doer, activity, listActivitiesPreDispatched)).Returns(true); 

問題是該列表。它由我正在測試的課程填充。我真的很關心這個參數,我想模擬IsCompatible忽略那個參數。那可能嗎?

否則,嘲笑只是不會捕捉方法調用。爲了緩解這些問題,我嘗試了將這個列表作爲我的類中的注入依賴項。它一直運行,直到列表開始填充,然後模擬停止捕獲電話。

你會怎樣嘲笑這件事?

+4

是不是'It.IsAny'等?這不在文檔中涵蓋了嗎? – bzlm 2012-03-29 17:48:38

回答

11

由於您使用的是Moq,因此您正在尋找It.IsAny<T>方法。由於您要更改列表的值,因此將對象實例傳遞給對象並不是正確的方法,因爲您必須不斷設置模擬來處理新參數。

以下示例將允許模擬接受List<T>類型的任何參數值。爲了這個例子,我們將使用List<int>

var mockRepositoryCheckCompatib = new Mock<ICheckCompatibilityActDoer>(); 
mockRepositoryCheckCompatib.Setup(c => c.IsCompatible(doer, activity, It.IsAny<List<int>>())).Returns(true); 

編輯:我沒有看到bzlm的評論,從根本上回答了這個問題。如果他發佈了一個,請接受他的回答,我不是故意要挖。

+5

我的評論就是這樣的:一個快速開車的筆記最多指出OP和未來的回答者朝着正確的方向,甚至不知道我是否正確。在SO上發佈答案永遠不會被視爲偷獵。即使兩個幾乎完全相同的答案也完全沒問題 - 社區會投票選擇哪一個更好。所以你做了正確的事情。 :) – bzlm 2012-03-30 14:59:02