27

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

4

3 回答 3

39

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

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

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

更多信息在这里

于 2013-10-09T00:05:26.277 回答
16

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

int callCounter = 0;
var mock = new Mock<IWhatever>();
mock.Setup(a => a.SomeMethod())
    .Returns(() => 
    {
       if (callCounter++ < 10)
       {
           // do something
       }
       else
       {
           // do something else
       }
    });
于 2013-01-16T21:48:06.003 回答
2

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

_serviceMock.Setup(x => x.SomeMethod(It.IsAny<String>())).Returns((String param) => getTimesCalled(param));
于 2014-03-31T19:56:57.323 回答