2013-01-08 26 views
0

我正在做我的一些c#代碼的單元測試,我必須使用相同的模擬,但返回不同的值。例如,我想在我的單元測試中這樣做:如何模擬兩個數據庫調用,使相同的查詢,但返回列表的不同部分

[Test] 

_mockDatabase.Setup(x => x.Query(It.IsAny<Filter>())).Returns(List[0]).Verifiable(); 

_mockDatabase.Setup(x => x.Query(It.IsAny<Filter>())).Returns(List[1]).Verifiable(); 

有沒有辦法在不改變我的實際代碼的情況下解決此問題。

+0

爲什麼你「必須使​​用相同的模擬」? – Carson63000

+0

,因爲我想調用相同的功能。對不起,我在單元測試中還是個新手。我可以爲被調用的同一個函數創建一個單獨的模擬嗎? –

+1

如果你想獲得兩個不同的嘲笑返回值,無論是創建兩個嘲笑,或而不是設置'查詢()'和'It.IsAny ',將它設置爲從兩個不同的濾波器參數返回兩個不同的返回值。 – Carson63000

回答

2

這通常可以通過使用Queue類來解決(注意Stack和類似的數據結構也能工作):

var queue = new Queue<string>(new [] { "First query", "Second query" }); 
// You only need 1 setup call 
_mockDatabase 
    .Setup(x => x.Query(It.IsAny<Filter>())) 
    .Returns(() => queue.Dequeue()) 
    .Verifiable(); 

Query每個後續調用將來自隊列出列當前元素。調用模擬兩次以上,就會產生「首先查詢」其次「第二個查詢」

相關問題