如何伪造抛出异常?

时间:2019-02-06 11:28:52

标签: fakeiteasy

我有以下设置

A.CallTo(() => fakeChargeService
       .CreateAsync(A<ChargeCreateOptions>._, A<RequestOptions>._, A<CancellationToken>._))
 .Throws<StripeException>((se) => stripeException);

然后我断言

 var msg = await Assert.ThrowsAsync<StripeException>(async () => await mediator.Send(command, CancellationToken.None));

最终将执行这段代码

        var policyResult = await Policy.Handle<StripeException>(x => x.ShouldRetry())
                                       .WaitAndRetryAsync(new[]
                                       {
                                           TimeSpan.FromSeconds(0.5),
                                           TimeSpan.FromSeconds(1),
                                           TimeSpan.FromSeconds(2),
                                       })
                                       .ExecuteAndCaptureAsync(async () => await this.chargeService.CreateAsync(options, null, cancellationToken));

在这里我得到了错误

Assert.Throws()失败 预期:typeof(Stripe.StripeException) 实际:typeof(FakeItEasy.Configuration.FakeConfigurationException):伪造的方法具有签名(Stripe.ChargeCreateOptions,Stripe.RequestOptions,System.Threading.CancellationToken),但引发与(Stripe.StripeException)一起使用。 >

我不确定自己做错了什么。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

您似乎在Throws中指定了错误的签名。 CreateAsync使用(Stripe.ChargeCreateOptions, Stripe.RequestOptions, System.Threading.CancellationToken),但Throws(Stripe.StripeException)一起使用。

请参见Throwing Exceptions中的第二个示例:

// Pass up to 4 original call argument values into the method that creates the exception.
A.CallTo(() => fakeShop.NumberOfSweetsSoldOn(A<DateTime>._))
 .Throws((DateTime when)=>new InvalidDateException(when + " is in the future"));

请注意,lambda的签名与调用的方法匹配。

您应该更新您的lambda以匹配正确的签名。还是更好,只需替换为

.Throws<StripeException>(stripeException)

因为根据您提供的代码片段,似乎没有任何理由可以懒惰地抛出。