Подтвердить что ты не робот

Moq для настройки возврата функции на основе вызываемых времен

Мне нужно высмеять интерфейс для вызова MSMQ, есть ли способ, которым я могу использовать Moq для имитации реального сценария MSMQ, что в очереди 10 сообщений, я вызываю посмешиваемую функцию 10 раз, и я могу получить предопределенный объект, в 11-й раз мне нужно получить другое возвращаемое значение (например, null)?

4b9b3361

Ответ 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));