ASP.net MVC - модульные тесты FluentValidation - PullRequest
4 голосов
/ 07 октября 2011

Я использую 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));
}

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

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

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

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

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

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

1 Ответ

10 голосов
/ 07 октября 2011

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

А для проверки действия контроллера просто смоделируйте ошибку состояния модели:

[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));
}

Контролер не должен ничего знать о быстрой проверке. Здесь вам нужно проверить, что в случае ошибки валидации в состоянии модели действие вашего контроллера будет работать правильно. То, как эта ошибка была добавлена ​​в состояние модели, является другой проблемой, которую следует протестировать отдельно.

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