Moq to set up a function return based on called times
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
}
});
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.