4

使用 FluentValidation,是否可以在单个规则失败时引发异常?例如,我想调用 Validate() 并且下面的第一条规则只是简单地验证,而第二条规则如果为假则抛出异常。

RuleFor(x => x.Title)
    .NotEmpty()
    .WithMessage("Please add a title for the project");

RuleFor(x => x.UserId)
    .NotEmpty()
    .WithMessage("User not supplied");

我可能试图强迫 FluentValidation 做一些它不打算做的事情。而且我知道 ValidateAndThrow() 方法,但这会在任何失败时引发异常。

4

2 回答 2

13

通常最好验证所有属性,然后报告结果,尽管可能存在继续验证没有意义的情况(在我的情况下,是在请求中缺少“租户”标识符时)。

只需将第二条规则更改为这样的内容(使用 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如果其他规则之一失败则抛出一个。
于 2017-02-05T17:41:26.373 回答
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);
    }
于 2011-06-20T17:49:56.503 回答