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

har*_*ang 20 c# moq

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

TGH*_*TGH 28

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

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

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

这里有更多信息.


Fre*_*örk 14

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

int callCounter = 0;
var mock = new Mock<IWhatever>();
mock.Setup(a => a.SomeMethod())
    .Returns(() => 
    {
       if (callCounter++ < 10)
       {
           // do something
       }
       else
       {
           // do something else
       }
    });
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案 也可以附加`.CallBack(...)`,其中省略号代表修改`callCounter`和可能的其他状态的委托. (2认同)