Проверка текучести не работает должным образом с тестом .Equal () - PullRequest
0 голосов
/ 30 октября 2018

Я создал тест FluentValidation (FV) для модели представления клиента. в модели тест:

{RuleFor(x => x.Email).NotNull().EmailAddress().WithMessage("Email format is Invalid").DependentRules(() => {
            RuleFor(x => x.EmailExists).Equal(1).WithMessage("Email is already in use!");                
        });

Итак, что должно произойти, так это то, что электронная почта проверена на предмет ее ненулевого значения и является настоящим форматом электронной почты. Затем, если этот тест пройден, зависимое правило проверяет другое поле, чтобы убедиться, что электронная почта еще не существует в таблице AspNetUsers. Я сделал это, выполнив тест во время метода POST страницы, перед тем, как передать модель в валидатор для проверки, например:

if (!string.IsNullOrEmpty(model.Email))
{
    var exists = _userService.UserExists(model.Email);
    model.EmailExists = exists ? 1 : 0;
}

CustomerAddViewModelValidator validator = new CustomerAddViewModelValidator();    
ValidationResult result = validator.Validate(model);

if (!result.IsValid) 
{
    model.ListTitles = GetTitlesList();              
    return View(model);
}

Пока все хорошо. Начальный тест для электронной почты работает, и он попадает в зависимую проверку, вот где его поведение становится странным:

Поведение: Если я использую: RuleFor(x => x.EmailExists).Equal(1) FV всегда сообщает, как будто электронная почта уже существует, даже если электронная почта не

Если я использую RuleFor(x => x.EmailExists).Equal(0) FV всегда сообщает, что электронная почта не существует, и не выдается предупреждение, даже если ввод электронной почты существует.

Первоначально я проводил этот тест на поле HiddenFor, но после прочтения ненавязчивой проверки JS я сделал EmailExists меткой на веб-странице Razor, пока не смог выяснить, почему она не сообщает о правильном состоянии.

non existen email shows message when it shouldnt

и когда электронная почта существует:

enter image description here

Итак, вы можете видеть, что правило FV сообщает об одном и том же сообщении, независимо от результата (0 или 1).

Может ли помочь? Я пытался использовать логическое значение с почти такими же результатами. Все остальные мои проверки работают успешно, так что я думаю, что я не использую правильную проверку?

Как всегда, заранее спасибо.

это обработанный код:

enter image description here

и вот снимок экрана:

enter image description here

и вот исправленное правило для:

RuleFor(x => x.Email).NotNull().EmailAddress().WithMessage("Email format is Invalid").DependentRules(() => { RuleFor(x => x.EmailExists).Equal(0).WithMessage("Email is already in use!"); });

Как видите, правило верное, но я получаю ЖЕ ПОВЕДЕНИЕ, ГДЕ РЕЗУЛЬТАТ 1 или), и независимо от того, существует электронная почта или нет ..:

enter image description here

1 Ответ

0 голосов
/ 01 ноября 2018

Проблема заключалась в том, что я пытался повлиять на модель в методе POST, ДО ТОГО, как вызывать валидатор FluentValidation для модели Customer. Хотя оказалось, что я могу обновить модель и увидеть, как она обновляется в IDE во время отладки, и, передав обновленные значения обратно в представление, обновление не происходило.

Я проверил это, передав случайную строку, соединенную с адресом электронной почты, который я тестировал. Это подтвердило, что, хотя казалось, что модель обновлялась с моей проверкой, это не имело место. Grr.

Чтобы решить эту проблему, я вместо этого добавил ошибку в состояние модели вне проверки:

public virtual ActionResult AddCustomer(CustomerAddViewModel model)
{            
    if (!string.IsNullOrEmpty(model.Email))
    {
      var exists = _userService.UserExists(model.Email);
      if (exists) 
      { 
        ModelState.AddModelError("Email", "Email Already Exists"); 
       }
    }
}

А затем просто отправьте сообщение об ошибке, как обычно, с помощью HTMl Helper:

@Html.ValidationMessageFor(x => x.Email, "", new { @class = "help-block" })

Я не понимаю, почему я не мог повлиять на модель до того, как была проведена валидация, но все еще мог видеть следы при переходе через код, это делало его намного более длинным, чем должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...