使用FluentValidation,是否可以在单个规则失败时抛出异常?例如,我想调用Validate(),并且下面的第一条规则只是验证,但是第二条规则如果为false则抛出异常。
RuleFor(x => x.Title)
.NotEmpty()
.WithMessage("Please add a title for the project");
RuleFor(x => x.UserId)
.NotEmpty()
.WithMessage("User not supplied");
我可能试图强制FluentValidation做一些它不打算做的事情。我知道ValidateAndThrow()方法,但这会在任何失败时引发异常。
答案 0 :(得分:7)
通常情况下,验证所有属性然后报告结果会更好,尽管可能存在继续验证没有意义的情况(在我的情况下,这是一个"租户"请求中缺少标识符。
只需将第二条规则更改为类似的内容(使用Automapper 5.2,C#6进行测试):
RuleFor(x => x.Title)
.NotEmpty()
.WithMessage("Please add a title for the project");
RuleFor(x => x.UserId)
.NotEmpty()
.OnAnyFailure(x =>
{
throw new ArgumentException(nameof(x.UserId));
});
IValidator.Validate(...)
并且第一条规则失败,那么它只会列在结果的Errors
列表中。Validate
的调用将引发ArgumentException
,显然不会返回任何结果。ValidateAndThrow
扩展方法,那么它将简单地返回,如果第二个规则失败则抛出ArgumentException
,或者如果其中一个规则失败则抛出ValidationException
。 答案 1 :(得分:0)
是。尝试这些方法 -
将FluentValidation和FluentValidation.TestHelper添加到指令中。
private readonly IValidator<ItemViewModel> validator = new ItemValidator();
//Assumes your fluent validation is in ItemValidator and your view model is ItemViewModel
[Test]
public void Headline_ShouldNotBeEmpty()
{
validator.ShouldHaveValidationErrorFor(f => f.message, string.Empty);
}