Question

Je vais avoir une information de recherche de mal à ce que je pense être un scénario assez simple. Je suis en train de test unitaire d'une action sur mon ASP.NET Mvc 2 contrôleur qui utilise un modèle d'entrée personnalisé w / DataAnnotions. Mon cadre test est xUnit, comme mentionné dans le titre.

Voici mon habitude Modèle d'entrée :

public class EnterPasswordInputModel
{
    [Required(ErrorMessage = "")]
    public string Username { get; set; }

    [Required(ErrorMessage = "Password is a required field.")]
    public string Password { get; set; }
}

Et voici mon Controller (a sorti une certaine logique pour simplifier cette 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();
}

Et voici mon xUnit Fait (également simplifié):

[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);
}

Quand je lance mon test, je reçois l'erreur suivante sur mon fait de test en essayant de récupérer le résultat du contrôleur (section Loi):

System.NullReferenceException: Object reference not set to an instance of an object.

Merci d'avance pour toute aide que vous pouvez offrir!

Était-ce utile?

La solution

Je pense que je suis sur la bonne voie à une solution bien. Voici le changement que je fis à mon contrôleur:

Original

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

Mise à jour

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

Il semble que la liaison modèle ne se produisait pas pendant mon test. Il semble que le modèle de liaison ne se fait pas à moins qu'un POST se produit. En forçant le modèle essayé, j'ai pu se lier d'obtenir le test à passer.

Remarque : Il y avait aussi une erreur dans mon action qui a été à l'origine ma référence nulle d'origine que j'ai fait en essayant de comprendre pourquoi

mon modèle n'a pas été en cours de validation.

Référence: http: // bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html

Autres conseils

Vous déréférencement une instance null dans votre action du contrôleur. Probablement dans le code que vous avez pris à « simplifier » la question. Regardez la pile d'appel dans les résultats des tests pour savoir quoi. Vous devrez peut-être quelque chose de faux pour le test.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top