C# 我能用最小起订量吗;设置序列以引发异常,然后返回void?
我试图设置Moq,在第一次调用时抛出异常,然后在第二次调用时返回void。我正在模拟的方法具有C# 我能用最小起订量吗;设置序列以引发异常,然后返回void?,c#,mocking,moq,C#,Mocking,Moq,我试图设置Moq,在第一次调用时抛出异常,然后在第二次调用时返回void。我正在模拟的方法具有void返回类型(例如公共void Bar()) 我尝试过的事情 这有编译错误,因为返回需要参数,而设置序列需要类型参数 _mock.SetupSequence(m => m.Bar()) .Throws<Exception>() .Returns(); 解决方法 最后,我放弃了SetupSequence(),转而使用Callback()抛出异常 var firstT
void
返回类型(例如公共void Bar()
)
我尝试过的事情
这有编译错误,因为返回
需要参数,而设置序列
需要类型参数
_mock.SetupSequence(m => m.Bar())
.Throws<Exception>()
.Returns();
解决方法
最后,我放弃了SetupSequence()
,转而使用Callback()
抛出异常
var firstTime = true;
_mock.Setup(m => m.Bar())
.Callback(() =>
{
if (firstTime)
{
firstTime = false;
throw new Exception();
}
});
问题
SetupSequence
采用Func
,而不是操作
。我假设这意味着SetupSequence()
不能用于模拟无效方法,对吗?您可以从Moq 4.8.0开始执行此操作:
SetupSequence
对void
方法的支持在GitHub问题中进行了讨论,并随GitHub pull请求一起添加
您可能正在寻找新的.Pass()
方法:
mock.SetupSequence(m => m.VoidMethod())
.Throws(new InvalidOperationException())
.Pass()
.Pass()
.Throws(new InvalidOperationException())
.Pass();
请注意,对
.Pass()
的后续调用可能是不必要的。据我所知,Setup
为每个调用定义了相同的行为。你有一个例子吗?
mock.SetupSequence(m => m.VoidMethod())
.Throws(new InvalidOperationException())
.Pass()
.Pass()
.Throws(new InvalidOperationException())
.Pass();