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

问题描述 投票:0回答:1

我试图设置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方法?

c# mocking moq
1个回答
4
投票

您可以从Moq 4.8.0开始:

SetupSequencevoid方法的支持在GitHub问题#451中进行了讨论,并添加了GitHub pull request #463

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

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

请注意,可能不需要对.Pass()进行尾随调用。

© www.soinside.com 2019 - 2024. All rights reserved.