2010-09-27 3 views
2

Comment pouvez-vous affirmer qu'un type attendu est retourné lorsqu'il est enveloppé dans un System.RuntimeType?Affirmation du type de retour du contrôleur MVC Action

Dans le cadre d'un test unitaire plus important visant à vérifier qu'une action possède les paramètres et les filtres d'action corrects, j'oppose une instance remplie de MethodInfo. Quand j'affirme contre "action.ReturnParameter" il échoue car il dit que le type est System.RunTimeType. Bien que je comprenne qu'il s'agit d'une enveloppe autour du type attendu, je n'arrive pas à trouver un moyen d'affirmer que l'instance enveloppée est du type attendu - la meilleure méthode que j'ai trouvée jusqu'ici est d'affirmer contre le nom ou le nom complet, mais c'est horrible car c'est juste en utilisant des "chaînes magiques".

Quelqu'un peut-il aider? Comme mes recherches sur Google n'ont rien trouvé d'utile, je suppose que la solution est très simple, je ne la vois pas.

Le code est le suivant:

[TestMethod] 
public void CheckActionFilterSet() 
{ 
    MethodInfo action = new CustomerController((new MockHttpContext()).Object) 
           .GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance) 
           .Where(mi => mi.Name.Equals("Search")).First(); 
    Assert.That(action.ReturnParameter.ParameterType, Is.InstanceOf(typeof(ViewResult)), "View Result should be of expected type"); 
} 

Message d'exception est:

Voir résultat devrait être de type attendu

attendu: instance de

< System.Web .Mvc.ViewResult >

Mais était:

<System.RuntimeType>

Répondre

3

Il suffit d'appeler la méthode du contrôleur et vérifier le type de l'objet qui est retourné:

var result = new CustomerController((new MockHttpContext()).Object).Search(....); 

Assert.That(result, Is.InstanceOf(typeof(ViewResult)), "View Result should be of expected type"); 

Vous pouvez également vérifier les valeurs de ViewData/modèle si vous voulez ...

+0

Oui, cela aurait été la façon dont je l'habitude de le faire. J'espérais juste qu'il y avait un moyen de le faire à partir de l'instance peuplée de methodInfo, car il semblerait mieux se reposer avec ce test. Ensuite, je n'aurais pas à vous soucier de vérifier le type de retour lors du test de la fonctionnalité de l'appel lui-même. –

+1

Mais vous ne pouvez pas vérifier de manière statique le type de l'objet renvoyé lors de l'exécution. Vous ne vérifiez que le type de retour avec lequel la méthode est déclarée. Par exemple, une méthode avec le type de retour ActionResult peut renvoyer une vue (ViewResult) dans un cas ou une instance de RedirectToRouteResult lorsque l'utilisateur n'est pas connecté. Votre test doit tester cette situation. –

+0

Bien sûr, cela prend tout son sens. Merci –

Questions connexes