单元测试

FluentValidation提供了一些扩展,这些扩展可以帮助我们对验证器进行单元测试。 我们建议将验证器视为“黑匣子”-向其提供输入,然后断言验证结果是否正确。

使用 TestValidate

我们可以使用TestValidate扩展方法来调用验证程序以进行单元测试,然后对结果执行断言。

例如,假设定义了以下验证器:

public class PersonValidator : AbstractValidator<Person>
{
    public PersonValidator() 
    {
        RuleFor(person => person.Name).NotNull();
    }
}

然后创建一个新的Xunit的单元测试项目,或者在旧的测试项目中添加一个新的文件如下。

public class PersonValidatorTester
{
    [Fact]
    public void Should_have_error_when_Name_is_null()
    {
        var model = new Person { Name = null };
        var validator = new PersonValidator();
        var result = validator.TestValidate(model);
        result.ShouldHaveValidationErrorFor(person => person.Name);
    }

    [Fact]
    public void Should_not_have_error_when_name_is_specified()
    {
        var model = new Person { Name = "Jeremy" };
        var validator = new PersonValidator();
        var result = validator.TestValidate(model);
        result.ShouldNotHaveValidationErrorFor(person => person.Name);
    }
}

如果断言失败,则会抛出ValidationTestException。

同样也可以对 ErrorMessage, Serverity 和 ErrorCode 进行断言

var result = validator.TestValidate(person);

result.ShouldHaveValidationErrorFor(person => person.Name)
  .WithErrorMessage("'Name' must not be empty.")
  .WithSeverity(Severity.Error)
  .WithErrorCode("NotNullValidator");

异步 TestValidate

FluentValidation还提供了异步TestValidateAsync方法,它与常规的ValidateAsync方法相对应。 用法类似,不同之处在于该方法返回等待的Task。

最近更新的
...