Модульное тестирование (xUnit) ASP.NET Mvc Controller с пользовательской моделью ввода? - PullRequest
1 голос
/ 14 мая 2010

Мне трудно найти информацию о том, что, как я ожидаю, будет довольно простым сценарием. Я пытаюсь выполнить модульное тестирование действия на моем контроллере ASP.NET Mvc 2, который использует пользовательскую модель ввода с данными DataAnnotions. Моя среда тестирования - 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();
}

А вот мой xUnit Fact (также упрощенный):

[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.

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

Ответы [ 2 ]

1 голос
/ 14 мая 2010

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

Оригинал

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

Обновлено

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

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

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

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

0 голосов
/ 14 мая 2010

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

...