FluentValidation提供了一些扩展,这些扩展可以帮助我们对验证器进行单元测试。 我们建议将验证器视为“黑匣子”-向其提供输入,然后断言验证结果是否正确。
我们可以使用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");
FluentValidation还提供了异步TestValidateAsync方法,它与常规的ValidateAsync方法相对应。 用法类似,不同之处在于该方法返回等待的Task。