2010-12-09 41 views
4

Voici une partie d'une action de contrôleur:modèle n'est pas validé automatiquement lors de tests unitaires

[HttpPost] 
public ActionResult NewComplaint(Complaint complaint) 
{ 
    if(!ModelState.IsValid) 
    { 
     // some code 
    } 
    // some more code... 
} 

Lors de l'exécution de l'application, le modèle est validé automatiquement avant l'instruction if est même appelé. Toutefois, lors de la tentative de test unitaire de ce code, la validation automatique ne se produit pas.

Si je devais utiliser un FormCollection et appeler TryUpdateModel à la place, la validation se produirait mais je ne veux pas l'utiliser.

J'ai trouvé qu'appeler TryValidateModel (modèle) avant l'instruction if fonctionne bien sur le problème; ne nécessitant qu'une seule ligne de code supplémentaire. Je préférerais m'en débarrasser cependant.

Des idées pour lesquelles la validation automatique ne se produit pas lors des tests unitaires, mais se produit lorsque l'application est en cours d'exécution?

EDIT: Vous avez oublié de mentionner, j'utilise ASP.NET MVC3 RC1 et je suis moqueur l'objet HttpContext du contrôleur si cela fait une différence

Répondre

4

La validation se produit pendant la liaison modèle (et TryUpdateModel effectue modèle de liaison).

Mais je pense que le problème est que ce que vous essayez de tester est le framework MVC (c'est-à-dire le fait que la validation se produit avant qu'une méthode d'action ne soit invoquée). Vous ne devriez pas tester ça.

Vous devez supposer que cette partie fonctionne (parce que nous l'avons testé intensivement) et ne tester que le code de votre application. Donc dans ce cas, la seule chose que vous devez railler est la valeur de retour de ModelState.IsValid et vous pouvez le faire en ajoutant une erreur de validation manuelle:

ModelState.AddModelError("some key", "some error message") 
+0

homme, maintenant je me sens stupide. Devrait juste fait cela ou se moquer de cela. Tout au long de mes tests, je crée un object/formCollection avec toutes les propriétés/entrées nécessaires pour faire passer la validation au lieu de simplement définir ModelState via des mock. – xTRUMANx

+7

marcind, j'obtiens ce test que le cadre est hors de portée pour la plupart des tests unitaires. Cependant, les tests doivent indiquer si les annotations de données correctes ont été spécifiées. – wilk