Moq to set up a function return based on called times

前端 未结 3 376
孤城傲影
孤城傲影 2021-01-01 11:34

I need to mock an interface to call to MSMQ, is there a way I can use Moq to simulate real MSMQ scenario that there are 10 messages in the queue, I call mocked function 10 t

相关标签:
3条回答
  • 2021-01-01 12:13

    I sometimes use a simple counter for such scenarios:

    int callCounter = 0;
    var mock = new Mock<IWhatever>();
    mock.Setup(a => a.SomeMethod())
        .Returns(() => 
        {
           if (callCounter++ < 10)
           {
               // do something
           }
           else
           {
               // do something else
           }
        });
    
    0 讨论(0)
  • 2021-01-01 12:23

    Moq now has an extension method called SetupSequence() in the Moq namespace which means you can define a distinct return value for each specific call.

    The general idea is that that you just chain the return values you need. In the example bellow the first call will return Joe and the second call will return Jane:

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

    Some more info here.

    0 讨论(0)
  • 2021-01-01 12:34

    You can also set up a separate function to do this. You can even pass the function a parameter if you want:

    _serviceMock.Setup(x => x.SomeMethod(It.IsAny<String>())).Returns((String param) => getTimesCalled(param));
    
    0 讨论(0)
提交回复
热议问题