Moq设置一个基于调用次数的函数返回
本文关键字:调用 返回 函数 设置 一个 Moq 于调用 | 更新日期: 2023-09-27 17:53:56
我需要模拟一个接口来调用MSMQ,是否有一种方法可以使用Moq来模拟真实的MSMQ场景,队列中有10个消息,我调用模拟函数10次,我可以得到一个预定义的对象,在第11次我应该得到一个不同的返回值(例如null)?
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));