我试图将Moq设置为在第一次调用时引发异常,然后在第二次调用时返回void。我嘲笑的方法具有void返回类型(例如public void Bar())。
我尝试过的事情
由于Returns需要参数和SetupSequence类型参数,因此存在编译错误。
_mock.SetupSequence(m => m.Bar())
.Throws<Exception>()
.Returns();
Run Code Online (Sandbox Code Playgroud)
由于Void不是C#中的类型,因此存在编译错误。
_mock.SetupSequence<IMyMock, Void>(m => m.Bar())
.Throws<Exception>() // first invocation throws exception
.CallBase();
Run Code Online (Sandbox Code Playgroud)
解决方法
最后,我放弃了SetupSequence(),转而Callback()抛出异常。
var firstTime = true;
_mock.Setup(m => m.Bar())
.Callback(() =>
{
if (firstTime)
{
firstTime = false;
throw new Exception();
}
});
Run Code Online (Sandbox Code Playgroud)
题
SetupSequence需要一个Func,而不是一个Action。我是否SetupSequence()可以假设此方法不能用于模拟void方法,对吗?