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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top