Сгенерировать исключение при сбое одного правила FluentValidation - PullRequest
2 голосов
/ 20 июня 2011

Используя 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 (), но это вызовет исключение при любом сбое.

Ответы [ 2 ]

7 голосов
/ 05 февраля 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, если одно из других правил не удалось.
0 голосов
/ 20 июня 2011

Да. Попробуйте что-нибудь в этом духе -

Добавьте 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...