ASP.net Модульные тесты MVC — FluentValidation

#asp.net-mvc #asp.net-mvc-3 #unit-testing #fluentvalidation

#asp.net-mvc #asp.net-mvc-3 #модульное тестирование #fluentvalidation

Вопрос:

Я использую FluentValidation в своем проекте MVC и имею следующую модель и средство проверки:

 [Validator(typeof(CreateNoteModelValidator))]
public class CreateNoteModel {
    public string NoteText { get; set; }
}

public class CreateNoteModelValidator : AbstractValidator<CreateNoteModel> {
    public CreateNoteModelValidator() {
        RuleFor(m => m.NoteText).NotEmpty();
    }
}
  

У меня есть действие контроллера для создания заметки:

 public ActionResult Create(CreateNoteModel model) {
    if( !ModelState.IsValid ) {
        return PartialView("Test", model);

    // save note here
    return Json(new { success = true }));
}
  

Я написал модульный тест для проверки поведения:

 [Test]
public void Test_Create_With_Validation_Error() {
    // Arrange
    NotesController controller = new NotesController();
    CreateNoteModel model = new CreateNoteModel();

    // Act
    ActionResult result = controller.Create(model);

    // Assert
    Assert.IsInstanceOfType(result, typeof(PartialViewResult));
}
  

Мой модульный тест терпит неудачу, потому что в нем нет ошибок проверки. Это должно быть успешным, потому что модель.NoteText имеет значение null, и для этого существует правило проверки.

Похоже, что FluentValidation не выполняется, когда я запускаю свой тест контроллера.

Я попытался добавить в свой тест следующее:

 [TestInitialize]
public void TestInitialize() {
    FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure();
}
  

У меня есть такая же строка в моем Global.asax, чтобы автоматически привязывать валидаторы к контроллерам…но, похоже, это не работает в моем модульном тестировании.

Как мне заставить это работать правильно?

Ответ №1:

Это нормально. Проверка должна проверяться отдельно от действий контроллера, например, так.

И чтобы проверить действие вашего контроллера, просто имитируйте ModelState ошибку:

 [Test]
public void Test_Create_With_Validation_Error() {
    // Arrange
    NotesController controller = new NotesController();
    controller.ModelState.AddModelError("NoteText", "NoteText cannot be null");
    CreateNoteModel model = new CreateNoteModel();

    // Act
    ActionResult result = controller.Create(model);

    // Assert
    Assert.IsInstanceOfType(result, typeof(PartialViewResult));
}
  

Контроллер не должен ничего знать о fluent validation. Что вам нужно проверить здесь, так это то, что если в ModelState вашем действии контроллера есть ошибка проверки, он ведет себя правильно. Как эта ошибка была добавлена к ModelState другой проблеме, которую следует проверить отдельно.

Комментарии:

1. Спасибо. Я не думал о добавлении ошибки модели в тест, подобный этому. Спасибо, Дарин.