#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. Спасибо. Я не думал о добавлении ошибки модели в тест, подобный этому. Спасибо, Дарин.