Правило цепочки Fluent Validation не работает с несколькими условиями - PullRequest
0 голосов
/ 04 сентября 2018

У меня действительно интересное поведение. У меня есть два теста ниже:

[Fact]
public void Ctor_WhenNeverIsTrueAndAfterOcurrenceIsNotNull_HasError()
{
    // arrange
    var reccurenceEnd = new RecurrenceEnd()
    {
         IsNever = true,
         AfterOccurence = 1
     };

     // act
     var validator = GetValidator();

     // assert
     validator.ShouldHaveValidationErrorFor(p => p.AfterOccurence, reccurenceEnd);
}

[Fact]
public void Ctor_WhenNeverIsFalseAndAfterOccurenceIsNullAndByDateIsNull_HasError()
{
    // arrange
    var reccurenceEnd = new RecurrenceEnd()
    {
        IsNever = false,
        AfterOccurence = null,
        ByDate = null
    };

    // act
    var validator = GetValidator();

    // assert
    validator.ShouldHaveValidationErrorFor(p => p.AfterOccurence, reccurenceEnd);
}

На моем валидаторе, если у меня есть следующее, первый тест не пройден, а второй проходит. Если я изменю порядок правил, первый тест пройден, а второй не пройден.

RuleFor(dto => dto.AfterOccurence)
    .Cascade(CascadeMode.StopOnFirstFailure)
    .Null()
        .When(p => p.IsNever == true)
    .NotEmpty()
        .When(p => p.IsNever == false && p.ByDate == null);

Если я изменю свой валидатор на следующий, оба теста пройдут.

RuleFor(dto => dto.AfterOccurence)
    .Null()
        .When(p => p.IsNever);
RuleFor(dto => dto.AfterOccurence)
    .NotEmpty()
        .When(p => p.IsNever == false && p.ByDate == null);

Я неправильно настраиваюсь?

1 Ответ

0 голосов
/ 04 сентября 2018

Хорошо, получил ответ от github-проблем FluentValidation :

Привет, это связано с использованием вами условия «Когда». По умолчанию условие When применяется ко всем предыдущим валидаторам в одном и том же вызове RuleFor, поэтому, когда вы используете один вызов RuleFor, вы по существу удваиваете условия. Вы должны либо использовать отдельные вызовы RuleFor (как у вас во втором примере), либо использовать другую перегрузку, когда это позволяет вам указать ApplyConditionTo.CurrentValidator

Второе решение будет:

RuleFor(dto => dto.AfterOccurence)
    .Cascade(CascadeMode.StopOnFirstFailure)
    .Null()
        .When(p => p.IsNever == true)
    .NotEmpty()
        .When(p => p.IsNever == false && p.ByDate == null, ApplyConditionTo.CurrentValidator);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...