2011-06-19 37 views
2

使用FluentValidation可以在单个规则失败时抛出异常吗?例如,我想调用Validate()和下面的第一条规则来简单地验证,但第二条规则如果为false则抛出异常。在单个FluentValidation规则失败时抛出异常

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

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

我可能试图强制FluentValidation做它没有设计的事情。我知道ValidateAndThrow()方法,但是这会在任何失败时抛出异常。

回答

-1

是的。尝试沿着这些方向 -

将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); 
    } 
+0

好吧,所以你建议有一个特定的属性/对象的Validator类,在我上面的例子中这将是UserId。这个Validator的唯一目的是在UserId验证失败时抛出异常? – Digbyswift

+0

由于原来的问题不是关于测试,而是由于实际的规则定义本身。 – JBert

2

通常情况下,最好以验证所有属性,然后报告结果,虽然有可能它是没有意义的,继续确认(在我的情况下,当“房客”标识是在缺少这是一个情况下,请求)。

只需更改第二个规则是这样的(与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
相关问题