Moq根据被叫时间设置函数返回

我需要模拟一个接口来调用MSMQ,有没有一种方法我可以使用Moq模拟真实的MSMQ场景,队列中有10条消息,我调用模拟函数10次,我可以获得一个预定义的对象,第11次我应该得到不同的返回值(例如null)?

Moq现在在Moq命名空间中有一个名为SetupSequence()扩展方法 ,这意味着您可以为每个特定的调用定义一个不同的返回值。

一般的想法是,您只需链接所需的返回值。 在下面的示例中,第一个调用将返回Joe ,第二个调用将返回Jane

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

这里有更多信息。

我有时会为这种情况使用一个简单的计数器:

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

您还可以设置单独的function来执行此操作。 如果需要,您甚至可以将函数传递给参数:

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