SetupSequence(...).Throws 缺少许多 Setup(...).Throws 具有的重载。
Setup.Throws 有一整套重载,用于接收被调用设置的原始参数:
IThrowsResult Throws<T, TException>(Func<T1, T2, ..., TException> exceptionFunction) where TException : Exception;
SetupSequence.Throws 有 no 重载接收被调用设置的原始参数,只是一个非接收委托,它只能制造与调用的参数无关的信息:
ISetupSequentialResult<TResult> Throws<TException>(Func<TException> exceptionFunction) where TException : Exception;
我在某些情况下需要设置序列(并希望保持在 MoQ 提供的 SetupSequence 机制的范围内,而不是滚动我自己的处理循环等),以及在哪里
想象一下 https://github.com/moq/moq4/issues/573 中给出的第一个示例,但是对于 .Throws
mock.SetupSequence(x => x.DoSomething(/* a verbose list of argument matchers here */))
.Returns(1)
.Returns(42)
.Returns((a, b, c) => CalculateSomeSpecialValueFromArgs(a, b))
//.Throws(new Exception("y"))
.Throws(async(a, b, c, delay, ct) => {
await Task.Delay(delay, ct);
return new Exception($"{a} {b} {c} failed");
})
.Returns(72);
...
我尝试/调查的事情:
制造一个 Func(最接近我希望的重载;至少它是一个委托),但这行不通,因为我无法提前创建一个具有调用的 arg 值的委托。
使用 .Callback 没有帮助,因为虽然它可以接收调用的 arg 值,但它无法影响 MoQ 的 .Throw 。
除了传递原始调用值之外,没有什么能帮助我也需要遵守的 CancellationToken 用法。
我怎样才能做我想做的事?