Хвърлете изключение при неизправност на едно правило на FluentValidation

Използвайки 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(), но това ще хвърли изключение при всяка грешка.


person Digbyswift    schedule 19.06.2011    source източник


Отговори (2)


да Опитайте нещо по този начин -

Добавете 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);
    }
person Gikote    schedule 20.06.2011
comment
Добре, значи предлагате да имате клас Валидатор за конкретно свойство/обект, в моя пример по-горе това ще бъде UserId. Единствената цел на този валидатор би била да хвърли изключение при неуспешно валидиране на UserId? - person Digbyswift; 23.06.2011
comment
Гласува се против, защото първоначалният въпрос не беше за тестване, а за самите действителни дефиниции на правилата. - person JBert; 23.08.2017

Обикновено е по-добре да валидирате всички свойства и след това да докладвате резултата, въпреки че може да има случай, в който няма смисъл да продължавате валидирането (в моя случай това беше, когато идентификаторът на „наемател“ липсваше в заявка).

Просто променете второто правило на нещо подобно (тествано с 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, ако едно от другите правила е неуспешно.
person JBert    schedule 05.02.2017