Тестирование единиц (XUNIT) контроллер ASP.NET MVC с пользовательской входной моделью?

StackOverflow https://stackoverflow.com/questions/2834390

Вопрос

У меня трудно найти информацию о том, что я ожидаю, чтобы быть довольно простым сценарием. Я пытаюсь установить проверку действия на моем контроллере ASP.NET MVC 2, который использует пользовательскую входную модель W / DataNoomtions. Моя структура тестирования - это XUNIT, как указано в названии.

Вот мой обычай Входная модель:

public class EnterPasswordInputModel
{
    [Required(ErrorMessage = "")]
    public string Username { get; set; }

    [Required(ErrorMessage = "Password is a required field.")]
    public string Password { get; set; }
}

И вот мой Контроллер (достал какую-то логику, чтобы упростить для этого бывшего.):

[HttpPost]
public ActionResult EnterPassword(EnterPasswordInputModel enterPasswordInput)
{
    if (!ModelState.IsValid)
        return View();

    // do some logic to validate input
    // if valid - next View on successful validation
        return View("NextViewName");
    // else - add and display error on current view
        return View();
}

И вот мой Факт ксунита (Также упрощено):

[Fact]
public void EnterPassword_WithValidInput_ReturnsNextView()
{
    // Arrange
    var controller = CreateLoginController(userService.Object);

    // Act
    var result = controller.EnterPassword(
        new EnterPasswordInputModel
            {
                Username = username, Password = password
            }) as ViewResult;

    // Assert
    Assert.Equal("NextViewName", result.ViewName);
}

Когда я бегу свой тест, я получаю следующую ошибку в случае теста при попытке получить результат контроллера (раздел ACT):

System.NullReferenceException: Object reference not set to an instance of an object.

Заранее спасибо за любую помощь, которую вы можете предложить!

Это было полезно?

Решение

Я думаю, что я на пути к решению, хотя. Вот изменение, которое я сделал в моем контроллере:

Оригинал

if (!ModelState.IsValid)
    return View();

Обновленный

if (!TryUpdateModel(loginInput))
            return View();

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

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

Ссылка:http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html.

Другие советы

Вы разыгрываете нулевой экземпляр внутри вашего контроллера. Вероятно, в коде вы вышли на «упростить» вопрос. Посмотрите на стек вызова в результатах теста, чтобы выяснить, что. Возможно, вам придется поднять что-то для теста.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top