Teste de unidade (xunit) Um controlador ASP.NET MVC com um modelo de entrada personalizado?
-
26-09-2019 - |
Pergunta
Estou tendo dificuldade em encontrar informações sobre o que espero ser um cenário bastante direto. Estou tentando testar uma ação no meu controlador ASP.NET MVC 2 que utiliza um modelo de entrada personalizado com dataNanTions. Minha estrutura de teste é Xunit, como mencionado no título.
Aqui está meu costume 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; }
}
E aqui está o meu Controlador (Peguei alguma 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();
}
E aqui está o meu Fato Xunit (também simplificado):
[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);
}
Quando execute meu teste, recebo o seguinte erro no fato de meu teste ao tentar recuperar o resultado do controlador (seção da ACT):
System.NullReferenceException: Object reference not set to an instance of an object.
Agradecemos antecipadamente por qualquer ajuda que você pode oferecer!
Solução
Acho que estou na pista de uma solução. Aqui está a mudança que fiz no meu controlador:
Original
if (!ModelState.IsValid)
return View();
Atualizada
if (!TryUpdateModel(loginInput))
return View();
Parece que a ligação ao modelo não estava ocorrendo durante o meu teste. Parece que a ligação do modelo não ocorre, a menos que ocorra uma postagem. Ao forçar a tentativa de ligação do modelo, consegui passar o teste.
Observação: Houve também um erro em minha ação que estava causando minha referência nula original que eu causei ao tentar descobrir por que meu modelo não estava sendo validado.
Referência:http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html
Outras dicas
Você está desreferenciando uma instância nula dentro da ação do controlador. Provavelmente no código que você levou para "simplificar" a pergunta. Veja a pilha de chamadas nos resultados do teste para descobrir o quê. Pode ser necessário zombar de algo para o teste.