我如何解决 Moq SetupSequence.Throws 缺少传递原始调用设置 args 的惰性 eval 重载

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

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 机制的范围内,而不是滚动我自己的处理循环等),以及在哪里

  • .Returns 或 .Throws 都需要调用参数值的上下文
  • 我需要在委托中执行逻辑。不只是返回异常(就像我想要一个 Task.Delay 在它假装抛出异常之前)。我不只是想模拟一个 .Throw,我想要一个 .Throw 在它投掷之前花了 N 毫秒。

想象一下 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);
    ...

我尝试/调查的事情:

  1. 制造一个 Func(最接近我希望的重载;至少它是一个委托),但这行不通,因为我无法提前创建一个具有调用的 arg 值的委托。

  2. 使用 .Callback 没有帮助,因为虽然它可以接收调用的 arg 值,但它无法影响 MoQ 的 .Throw 。

  3. 除了传递原始调用值之外,没有什么能帮助我也需要遵守的 CancellationToken 用法。

我怎样才能做我想做的事?

c# moq
© www.soinside.com 2019 - 2024. All rights reserved.