Unidad de Pruebas (xUnit) un controlador de ASP.NET MVC con un modelo de entrada personalizado?
-
26-09-2019 - |
Pregunta
Estoy teniendo un hallazgo información dificultades en lo que espero ser un escenario bastante sencillo. Estoy tratando de probar la unidad de una acción en mi controlador de ASP.NET MVC 2 que utiliza un modelo de entrada personalizado w / DataAnnotions. Mi marco de pruebas es xUnit, como se ha mencionado en el título.
Aquí es mi costumbre Modelo de entrada
public class EnterPasswordInputModel
{
[Required(ErrorMessage = "")]
public string Username { get; set; }
[Required(ErrorMessage = "Password is a required field.")]
public string Password { get; set; }
}
Y aquí está mi controlador (sacó algo de lógica para simplificar para este ex.):
[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();
}
Y aquí está mi xUnit Hecho (también simplificada):
[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);
}
Cuando ejecuto mi prueba me sale el siguiente error en mi prueba de hecho cuando se trata de recuperar el resultado controlador (sección de la Ley):
System.NullReferenceException: Object reference not set to an instance of an object.
Gracias de antemano por cualquier ayuda que puede ofrecer!
Solución
creo que estoy en el camino a una solución sin embargo. Aquí está el cambio que hice a mi controlador:
ORIGINAL
if (!ModelState.IsValid)
return View();
Actualización
if (!TryUpdateModel(loginInput))
return View();
Parece que no fue modelo de unión que se produce durante mi prueba. Parece ser que el enlace de modelos no se produce a menos que ocurra un POST. Al forzar el intento vinculante yo era capaz de conseguir la prueba de pasar modelo.
Nota: . También hubo un error en mi acción que estaba causando mi referencia nula original que hice al tratar de averiguar por qué no se está validando mi modelo
Referencia: http: // bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html
Otros consejos
Esta eliminación de referencias a una instancia dentro de su nula acción del controlador. Es probable que en el código que sacó a "simplificar" la cuestión. Mira la pila de llamadas en los resultados de las pruebas para averiguar qué. Es posible que necesite algo para simulacro de la prueba.