2013-01-16 53 views
18

我需要模擬一個接口來調用MSMQ,有沒有一種方法可以使用Moq來模擬真正的MSMQ場景,在隊列中有10條消息,我稱之爲嘲笑函數10次,我可以得到一個預定義的對象,在第11次我應該得到不同的返回值(例如空)?Moq根據被調用的時間設置函數返回

回答

22

起訂量現在有一個擴展方法Moq命名空間,這意味着你可以爲每個特定呼叫定義不同的返回值稱爲SetupSequence()

一般的想法是,你只需鏈接你需要的返回值。 在波紋管第一次調用的例子將返回的第二呼叫將返回

customerService 
.SetupSequence(s => s.GetCustomerName(It.IsAny<int>())) 
.Returns("Joe") //first call 
.Returns("Jane"); //second call 

一些更多的信息here

+0

這確實是我一直在尋找:)真棒。 – Silwing

+0

這甚至更好! – hardywang

+0

它看起來像鏈接是無關緊要的:/ – reddy

12

我有時用一個簡單的計數器對這樣的場景:

int callCounter = 0; 
var mock = new Mock<IWhatever>(); 
mock 
    .Setup(mock => mock.SomeMethod()) 
    .Returns(() => 
    { 
     if (callCounter++ < 10) 
     { 
      // do something 
     } 
     else 
     { 
      // do something else 
     } 
    }); 
+2

好的解決方案。也可以追加'.CallBack(...)',其中省略號代表修改'callCounter'和可能的其他狀態的委託。 –

+0

這確實是一個非常出色的想法。 – hardywang

2

你也可以設置一個單獨的功能來做到這一點。你甚至可以通過函數參數,如果你想:

_serviceMock.Setup(x => x.SomeMethod(It.IsAny<String>())).Returns((String param) => getTimesCalled(param));