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

时间:2013-01-16 21:40:54

标签: c# moq

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

3 个答案:

答案 0 :(得分:27)

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

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

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

更多信息here

答案 1 :(得分:14)

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

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

答案 2 :(得分:2)

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

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