Возвращение разных результатов или выдача исключений из последовательных вызовов в Moq Mock - PullRequest
14 голосов
/ 22 июня 2010

Я получаю объект Moq для возврата различных значений при последовательных вызовах метода. Это делается с помощью этого метода расширения:

public static void ReturnsInOrder<T, TResult>(this ISetup<T, TResult> setup, params TResult[] results) where T : class
{
    setup.Returns(new Queue<TResult>(results).Dequeue);
}

Теперь я хочу, чтобы один из вызовов вызвал исключение, в то время как другие что-то возвращают. Кто-нибудь делал это раньше?

Если я сделаю это

mock.Setup(m => m.SomeMethod())
    .Throws(new Exception());
mock.Setup(m => m.SomeMethod())
    .Returns("ok");

, тогда первая настройка перезаписывается и сохраняется только вторая настройка.

Ответы [ 4 ]

11 голосов
/ 07 ноября 2012

В настоящее время Moq (версия 4+) поддерживает это с помощью метода SetupSequence. См. этот пост для ознакомления.

9 голосов
/ 21 июля 2010

Я использовал цепочку обратных вызовов при разработке прокси-сервера для повторных попыток.

var src = new Mock<ITest>();
src.Setup(s => s.RaiseError()).Callback(() => 
src.Setup( s => s.RaiseError())).Throws<Exception>();

const int retryCount = 1;
var proxy = RetryProxy.MakeFor(src.Object, retryCount);

proxy.RaiseError();
src.Verify(s => s.RaiseError(), Times.Exactly(retryCount+1));
8 голосов
/ 22 июня 2010
1 голос
/ 15 марта 2017

Используйте SetupSequence(...) на фиктивном объекте.

Например, следующее вызовет исключение при первом вызове и вернет someResponse при втором вызове:

myService.SetupSequence(s => s.PlaceOrder())
    .Throws(new Exception())
    .Returns(someResponse);
...