返回不同的结果或从连续调用Moq Mock中抛出异常

时间:2010-06-22 13:21:05

标签: mocking moq

我得到一个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 个答案:

答案 0 :(得分:11)

如今Moq(版本4+)通过其SetupSequence方法支持此功能。有关简介,请参阅this post

答案 1 :(得分:9)

我在开发重试代理时使用了回调链接。

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));

答案 2 :(得分:8)

菲尔哈克blogged about this

答案 3 :(得分:1)

在模拟对象上使用SetupSequence(...)

例如,以下内容将在第一次调用时抛出异常并在第二次调用时返回someResponse

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