Moq设置一个基于调用次数的函数返回

本文关键字:调用 返回 函数 设置 一个 Moq 于调用 | 更新日期: 2023-09-27 17:53:56

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

Moq设置一个基于调用次数的函数返回

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

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

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

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

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

您也可以设置一个单独的函数来完成此操作。如果你想的话,你甚至可以给函数传递一个参数:

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