我在我的MVC项目中使用FluentValidation并具有以下模型和验证器:
[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));
}
我的单元测试失败,因为它没有任何验证错误。这应该成功,因为model.NoteText为null并且有一个验证规则。
当我运行控制器测试时,似乎没有运行FluentValidation。
我尝试在测试中添加以下内容:
[TestInitialize]
public void TestInitialize() {
FluentValidation.Mvc.FluentValidationModelValidatorProvider.Configure();
}
我的Global.asax中有相同的行,可以自动将验证器绑定到控制器......但它似乎不能在我的单元测试中工作。
如何使其正常工作?
答案 0 :(得分:10)
这是正常的。验证应与控制器操作like this分开测试。
要测试控制器操作,只需模拟模型状态错误:
[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));
}
控制器不应该对流畅的验证有任何了解。您需要在此测试的是,如果模型状态中存在验证错误,则控制器操作的行为正确。如何将这个错误添加到模型状态是另一个需要单独测试的问题。