jam*_*ind 5 autofixture nsubstitute
我收到以下异常:
NSubstitute.Exceptions.NotASubstituteException:NSubstitute扩展方法(如.Received())只能在使用Substitute.For()和相关方法创建的对象上调用。
...在调用chargeService.When()时:
public class WhenUserTopsUpAndStripeRejectsPaymentRequest
{
[Theory, AutoNSubstituteData]
public void it_should_throw_AutoTopUpFailedException(
[Frozen] StripeChargeService chargeService,
[Frozen] IRepository repository,
TopUpUserAccountBalance message,
TopUpUserAccountBalanceHandler sut) <== has dependency on StripeChargeService
{
repository.Find(Arg.Any<ById<User>>())
.Returns(new User
{
AutoTopUpEnabled = true,
AccountBalance = -15
});
=====> chargeService.When(s => s.Create(Arg.Any<StripeChargeCreateOptions>()))
.DoNotCallBase();
Assert.Throws<AutoTopUpFailedException>(() => sut.Handle(message));
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我当然可以按照异常建议进行操作,并手动创建StripeChargeService,然后手动创建所有依赖项并将其注入到SUT中,以解决此问题,但是我宁愿使用更少的代码并让AutoFixture完成工作。
public class AndStripeRejectsPaymentRequest
{
[Theory, AutoNSubstituteData]
public void it_should_throw_AutoTopUpFailedException(
IMediator mediator,
IBillingConfig config,
[Frozen] IRepository repository,
TopUpDriverAccountBalance message)
{
var chargeService = Substitute.ForPartsOf<StripeChargeService>("");
repository.Find(Arg.Any<ById<Driver, TopUpDriverAccountBalanceHandler.DriverProjection>>())
.Returns(new TopUpDriverAccountBalanceHandler.DriverProjection
{
AutoTopUpEnabled = true,
AccountBalance = -15
});
chargeService.When(s => s.Create(Arg.Any<StripeChargeCreateOptions>()))
.DoNotCallBase();
// Manually build SUT, with params declared above.
var sut = new TopUpDriverAccountBalanceHandler(mediator, repository, config, chargeService);
Assert.Throws<AutoTopUpFailedException>(() => sut.Handle(message));
}
}
Run Code Online (Sandbox Code Playgroud)
我认为,通过AutoNSubstituteCustomization()在AutoFixture.AutoNSubstitute NuGet包,自动嘲笑参数将使用NSubstitute创建。我究竟做错了什么?
该AutoNSubstituteCustomization替代抽象而已。如果需要创建具体类的替代品,则应使用[Ploeh.AutoFixture.AutoNSubstitute.SubstituteAttribute]属性显式修饰参数:
[Theory, AutoNSubstituteData]
public void it_should_throw_AutoTopUpFailedException(
[Substitute] StripeChargeService chargeService)
// ...
Run Code Online (Sandbox Code Playgroud)
请注意(对于v3.47.3),不幸的是,这不能与[Frozen]属性结合使用(请参阅相应的AutoFixture 问题)。
更新
解决方法是,您可以在中替换StripeChargeService类型的实例AutoNSubstituteDataAttribute(或为此创建相应的自定义):
internal class AutoNSubstituteDataAttribute : AutoDataAttribute
{
public AutoNSubstituteDataAttribute()
{
this.Fixture.Customize(new AutoNSubstituteCustomization());
// Substitute an instance of the 'StripeChargeService' type
this.Fixture.Customizations.Insert(
0,
new FilteringSpecimenBuilder(
new MethodInvoker(new NSubstituteMethodQuery()),
new ExactTypeSpecification(typeof(StripeChargeService))));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
503 次 |
| 最近记录: |