Проверка модели не работает в модульном тесте - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть следующий модульный тест:

[TestMethod]
public void GivenInvalidUrlExpectInvalidModelState()
{
    //Arrange
    HomeController homeController = new HomeController();
    InputFields inputFields = new InputFields { Url = "google.com/", KeyWords = "some key words" };

    //Act
    ViewResult actionResult = homeController.GetResults(inputFields);

    //Assert
    Assert.IsFalse(actionResult.ViewData.ModelState.IsValid);
}

И следующая модель:

public class InputFields
{
    [Url]
    [Required(ErrorMessage="Please provide a URL")]
    public string Url { get; set; }
    [Required(ErrorMessage="Please provide key words")]
    public string KeyWords { get; set; }
}

Когда я обращаюсь к контроллеру из пользовательского интерфейса с недопустимым URL-адресом (без протокола), таким как google.com/, ModelState ложно, как и ожидалось.

Однако в модульном тесте ModelState имеет значение true.

Почему модель не проверяется в модульном тесте?

1 Ответ

0 голосов
/ 28 апреля 2018

Эти атрибуты проверки оцениваются средой asp.net mvc во время выполнения через конвейер. При запуске модульного теста нет конвейера, поэтому определенные ожидания не применимы.

Вы бы сами манипулировали состоянием

[TestMethod]
public void GivenInvalidUrlExpectInvalidModelState() {
    //Arrange
    var homeController = new HomeController();
    //manually adding error that would cause `ModelState.IsValid` to be false
    homeController.ModelState.AddModelError("Url", "invalid data");
    var inputFields = new InputFields { Url = "google.com/", KeyWords = "some key words" };

    //Act
    ViewResult actionResult = homeController.GetResults(inputFields);

    //Assert
    Assert.IsFalse(actionResult.ViewData.ModelState.IsValid);
}

Чтобы проверить состояние модели в конвейере, вам, вероятно, потребуется выполнить сквозное интеграционное тестирование, когда к контроллеру подается HTTP-запрос

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