我正在使用TDD方法将xUnit 2,NSubstitute,AutoFixture,FluentAssertions用于我的单元测试。
我想测试使用FluentValidation的服务方法。
简单示例:
验证
$date = date("Y-m-d",strtotime("+1 month", strtotime('2016-01-01')));
echo $date;
//output 2016-02-01
我的服务(接受测试):
RuleSet("Nulls", () =>
{
RuleFor(viewModel => viewModel).NotNull();
});
我的单元测试:
我不知道如何模仿if(Validate(viewModel, "Nulls"))
//....
private bool Validate(AddMerchantViewModel viewModel, string option)
{
var result = _merchantValidator.Validate(viewModel, ruleSet: options);
return result.IsValid;
}
结果。
merchantValidator.Validate
答案 0 :(得分:1)
默认情况下,AutoFixture会在每次请求时创建一个新类型的实例。在这种特殊情况下,AbstractValidator<AddMerchantViewModel>
类型被实例化两次 - 作为merchValidator
参数和MerchantsService
类的依赖项。
因此,服务不使用已配置的验证程序。为了解决这个问题,您应该使用merchValidator
属性修饰[Frozen]
参数,以便AF始终返回AbstractValidator<AddMerchantViewModel>
类型的相同实例:
[Theory, AutoNSubstituteData]
public void Add_ViewModelAsNull_ShouldThrowArgumentNullException(
[Frozen]AbstractValidator<AddMerchantViewModel> merchValidator,
MerchantsService service)
// ...
更多信息可以找到[Frozen]
属性here。