我可以使用Moq的SetupSequence抛出异常然后返回void吗?

时间:2017-12-10 21:59:30

标签: c# mocking moq

我正在尝试设置Moq以在第一次调用时抛出异常,然后在第二次调用时返回void。我嘲笑的方法有一个void返回类型(例如public void Bar())。

我尝试过的事情

这有编译错误,因为Returns需要参数而SetupSequence需要类型参数。

_mock.SetupSequence(m => m.Bar())
    .Throws<Exception>()
    .Returns();

这有一个编译错误,因为Void不是C#中的类型。

_mock.SetupSequence<IMyMock, Void>(m => m.Bar())
    .Throws<Exception>() // first invocation throws exception
    .CallBase();

解决方法

最后我放弃了SetupSequence()并切换到Callback()以抛出异常。

var firstTime = true;
_mock.Setup(m => m.Bar())
    .Callback(() =>
    {
        if (firstTime)
        {
            firstTime = false;
            throw new Exception();
        }
    });

问题

SetupSequence需要Func,而非Action。我是否正确假设这意味着SetupSequence()不能用于模拟void方法?

1 个答案:

答案 0 :(得分:3)

您可以从Moq 4.8.0开始:

在GitHub问题#451中讨论了对SetupSequence方法的

void支持,并添加了GitHub拉取请求#463

您可能正在寻找新的 .Pass() 方法:

mock.SetupSequence(m => m.VoidMethod())
    .Throws(new InvalidOperationException())
    .Pass()
    .Pass()
    .Throws(new InvalidOperationException())
    .Pass();

请注意,可能不需要追踪.Pass()