使用FluentValidation进行单元测试。如何模拟ValidationResult

时间:2016-06-15 08:43:16

标签: unit-testing xunit fluentvalidation autofixture nsubstitute

我正在使用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

1 个答案:

答案 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