FluentValidation ShouldHaveValidationErrorFor с SetCollectionValidator

Я использую библиотеку FluentValidation в проекте ASP.NET MVC, и с точки зрения пользовательского интерфейса она работает так, как ожидалось. Нарушения правил отображают правильные ошибки.

У меня есть родительский класс с валидатором и свойством коллекции, где у этого типа есть валидатор. Концептуально это то же самое, что описано в документации.

У меня есть валидатор для родительского класса...

public class MyFormValidator : AbstractValidator<MyFormViewModel>

...и у меня есть коллекция в MyFormViewModel...

public IList<ChildRow> ChildRowsAdded { get; set; }

... и я создаю валидатор для коллекции этого дочернего класса...

public class ChildRowValidator : AbstractValidator<ChildRow>

... и я использую этот дочерний валидатор в родительском валидаторе...

RuleFor(m => m.ChildRowsAdded).SetCollectionValidator(new ChildRowValidator());

При написании некоторых модульных тестов я заметил, что ShouldHaveValidationErrorFor не подтверждает наличие ошибок.

_validator.ShouldHaveValidationErrorFor(x => x.ChildRowsAdded, model);

Эта строка в моем тесте, похоже, не видит ошибок. Тест не пройден, и в сообщении говорится

FluentValidation.TestHelper.ValidationTestException: ожидается ошибка проверки для свойства AllergyRowsAdded.

Если я вручную .Validate() и смотрю на результаты, я вижу ошибку.

Кто-нибудь сталкивался с этим раньше? Есть ли дополнительный шаг, который мне нужно предпринять, чтобы использовать ShouldHaveValidationErrorFor в этой ситуации?


person Mattio    schedule 05.02.2015    source источник
comment
Я думал, что вы можете использовать validator.ShouldHaveValidationErrorFor(m => m.Childs[0].Name, model);, но это тоже не работает. Когда я просмотрел исходные коды FluentValidation, мне показалось, что использовать ShouldHaveValidationErrorFor assert для этого типа теста невозможно.   -  person Lukas.Navratil    schedule 06.02.2015
comment
Для всех, кто заинтересован, я разместил это на доске обсуждений проекта и получил там более подробную информацию. fluentvalidation.codeplex.com/discussions/580454#post1351410   -  person Mattio    schedule 13.02.2015


Ответы (1)


Джукин абсолютно прав в своем комментарии:

ShouldHaveValidationErrorFor не предназначен для проверки свойств свойств, вы можете прочитать об этом здесь.

Есть 2 решения:

  1. Используйте ShouldHaveValidationErrorFor и протестируйте ChildRowValidator напрямую, например: _childValidator.ShouldHaveValidationErrorFor(x => x.Name, childModel); // direct descendant property can be validated
  2. Избегайте этого вспомогательного метода и используйте класс Assert, чтобы проверить, существует ли в объекте ValidationResult какая-либо ошибка с именем, которое соответствует свойству вашего элемента (ов) массива с помощью регулярного выражения или простого сравнения строк.

Выбирайте тот, который больше соответствует вашим целям.

person Evgeny Levin    schedule 10.04.2015