2010-05-14 24 views
1

J'ai de la difficulté à trouver des informations sur ce que je pense être un scénario assez simple. J'essaie de tester une action sur mon contrôleur ASP.NET Mvc 2 qui utilise un modèle d'entrée personnalisé avec DataAnnotions. Mon framework de test est xUnit, comme mentionné dans le titre.Unité Test (xUnit) un contrôleur Mvc ASP.NET avec un modèle d'entrée personnalisé?

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!

+0

Lorsque vous déboguez, ce qui est nul? ModelState? – Jab

Répondre

1

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

originale

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

Mise à jour

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

Il semble que le modèle de liaison ne se produisait pas pendant mon test. Il semble que la liaison de modèle n'ait pas lieu à moins qu'un POST se produise. En forçant la tentative de liaison du modèle, j'ai réussi à faire passer le test.

Remarque: Une erreur s'est produite dans mon action qui provoquait la référence nulle d'origine que j'avais provoquée en essayant de comprendre pourquoi mon modèle n'était pas validé.

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

+1

whoops - pour l'exemple Stack Overflow ma mise à jour aurait dû utiliser "enterPasswordInput" et non "loginInput". Ce dernier est utilisé dans mon code réel. = P –

0

Vous déréférencer une instance nulle dans votre action de contrôleur. Probablement dans le code que vous avez sorti pour "simplifier" la question. Regardez la pile d'appels dans les résultats de test pour savoir quoi. Vous devrez peut-être vous moquer de quelque chose pour le test.

+1

Smack sur mon erreur d'origine! Le vrai problème était que mon modèle n'était pas validé en utilisant ModelState.IsValid dans l'action du contrôleur. Ma réponse ci-dessous se développe sur ce ... –