Тестирование единиц (XUNIT) контроллер ASP.NET MVC с пользовательской входной моделью?
-
26-09-2019 - |
Вопрос
У меня трудно найти информацию о том, что я ожидаю, чтобы быть довольно простым сценарием. Я пытаюсь установить проверку действия на моем контроллере 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.
Другие советы
Вы разыгрываете нулевой экземпляр внутри вашего контроллера. Вероятно, в коде вы вышли на «упростить» вопрос. Посмотрите на стек вызова в результатах теста, чтобы выяснить, что. Возможно, вам придется поднять что-то для теста.