Мне нужно высмеять интерфейс для вызова MSMQ, есть ли способ, которым я могу использовать Moq для имитации реального сценария MSMQ, что в очереди 10 сообщений, я вызываю посмешиваемую функцию 10 раз, и я могу получить предопределенный объект, в 11-й раз мне нужно получить другое возвращаемое значение (например, null)?
Moq для настройки возврата функции на основе вызываемых времен
Ответ 1
Теперь у Moq теперь есть метод расширения, который называется SetupSequence()
в пространстве имен Moq
, что означает, что вы можете определить отдельное возвращаемое значение для каждого конкретного вызова.
Общая идея заключается в том, что вы просто связываете возвращаемые значения, которые вам нужны. В следующем примере первый вызов вернет Joe, а второй вызов вернет Jane:
customerService
.SetupSequence(s => s.GetCustomerName(It.IsAny<int>()))
.Returns("Joe") //first call
.Returns("Jane"); //second call
Дополнительная информация здесь.
Ответ 2
Я иногда использую простой счетчик для таких сценариев:
int callCounter = 0;
var mock = new Mock<IWhatever>();
mock
.Setup(mock => mock.SomeMethod())
.Returns(() =>
{
if (callCounter++ < 10)
{
// do something
}
else
{
// do something else
}
});
Ответ 3
Вы также можете настроить отдельную функцию для этого. Вы даже можете передать функцию параметр, если хотите:
_serviceMock.Setup(x => x.SomeMethod(It.IsAny<String>())).Returns((String param) => getTimesCalled(param));