2011-06-19 14 views
2

FluentValidationを使用すると、単一のルールの失敗で例外をスローすることはできますか?たとえば、Validate()を呼び出し、以下の最初のルールでは単純に検証しますが、2番目のルールではfalseを指定すると例外がスローされます。単一のFluentValidationルールの失敗で例外をスローする

私はおそらく、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です。このバリデータの唯一の目的は、UserIdの検証に失敗した場合に例外をスローすることでしょうか? – Digbyswift

+0

元の質問はテストに関するものではなかったため、実際のルール定義そのものに関するものでした。 – JBert

2

通常、それはすべてのプロパティを検証し、それが「テナント」識別子が中に行方不明になったとき、それがあった私の場合には(検証し続けることは意味をなさない場合があることができますが、その後、結果を報告する方が良いでしょう要求)。

はちょうどこのような何かに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に表示されます失敗した場合結果のリスト。
  • 2番目のルールが失敗した場合、Validateを呼び出すとArgumentExceptionが呼び出され、明らかに結果は返されません。
  • ValidateAndThrow拡張メソッドを呼び出す場合は、2番目のルールが失敗した場合はArgumentExceptionを返し、他のルールのいずれかが失敗した場合はValidationExceptionを返します。
関連する問題