2010-07-21 13 views
2

Comment puis-je tester quelle vue a été rendue à partir d'une action du contrôleur si ce que j'obtiens est un T4MVC_ActionResult? Dans des circonstances normales, je devrais être en mesure d'utiliser directement les méthodes de TestHelper, comme dans the examples:Comment tester les vues rendues lors de l'utilisation de T4MVC avec TestHelper?

pooController.Details().AssertViewRendered().ForView("Details") 

... mais, puisque par T4MVC je reçois un T4MVC_ActionResult au lieu d'un ViewResult, la partie AssertViewRendered<>().ForView("Details") échoue. Quelle alternative ai-je si je veux tester quelle vue a été invoquée?


MISE À JOUR:

Voici le code de test:

[TestMethod] 
public void Theme_Controller_Details_Action_Returns_Details_View() 
{ 
    var builder = new TestControllerBuilder(); 
    var mockThemeRepository = new Mock<IThemeRepository>(); 
    var themeController = builder.CreateController<Evalgrid.Website.Controllers.ThemeController>(mockThemeRepository.Object); 
    builder.InitializeController(themeController); 

    var result = themeController.Details(); 
    result.AssertViewRendered().ForView("Details"); 
} 

J'ai utilisé le débogueur fixant un point d'arrêt après la ligne result, et son type de variable est T4MVC_ActionResult, tandis que themeController est Evalgrid.Website.controllers.ThemeController . Notez que j'ai utilisé le nom complet du contrôleur.

Je reçois ceci:

Résultat attendu pour être de type ViewResult. Il est en fait de type T4MVC_ActionResult.

Je ne sais pas ce qui se passe.

+0

Étrange. D'où vient TestControllerBuilder? –

+0

@David TestControllerBuilder vient de MvcContrib.TestHelper http://mvccontrib.codeplex.com/wikipage?title=TestHelper#Examples –

+1

Ok, je vais devoir me familiariser avec cela et enquêter. Je reviendrai vers toi. –

Répondre

1

En fait, T4MVC ne devrait pas faire de différence ici. Si vous instanciez directement votre contrôleur et appelez une méthode d'action, vous obtiendrez la même chose si vous utilisez T4MVC ou non. c'est-à-dire que vous n'obtiendrez pas de T4MVC_ActionResult.

Ce n'est que lorsque vous écrivez MVC.Foo.Details() que vous obtenez un T4MVC_ActionResult. C'est parce que MVC.Foo retourne une instance d'une classe dérivée qui fait quelque chose de spécial, et pas directement votre classe de contrôleur.

Est-ce que cela a du sens?

Mise à jour: Je suis confus, comme regardant les sources pour TestControllerBuilder.CreateController, il a:

public T CreateController<T>(params object[] constructorArgs) where T : Controller 
{ 
    var controller = (Controller)Activator.CreateInstance(typeof(T), constructorArgs); 
    InitializeController(controller); 
    return controller as T; 
} 

Il est instancier directement le type que vous passez, ce qui devrait simplement appeler votre normale action.

Une question sur votre code: votre méthode d'action Details prend-elle des paramètres? Si oui, cela expliquerait le problème, comme vous l'appelez sans paramètres, ce qui serait une méthode T4MVC ajoutée dans la classe partielle.

+0

Je pense que je le fais, mais j'ai toujours le problème. J'ai ajouté plus de détails. –

+0

Ah ... dang, tu as absolument raison. Cela prend un seul paramètre. Je ne peux pas vous remercier assez. –