7

Je souhaite tester l'événement OnException, OnActionExecuted d'un contrôleur MVC.Comment tester un événement d'un contrôleur MVC

Si j'utilise comme cette maquette:

 var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
     var request = MockRepository.GenerateMock<HttpRequestBase>(); 

     httpContext.Expect(c => c.Request).Return(request).Repeat.AtLeastOnce(); 
     request.Expect(r => r.IsAuthenticated).Return(true).Repeat.AtLeastOnce(); 


     var controller = new MyController() ; 

     controller.ControllerContext = new ControllerContext(httpContext, 
                  new RouteData(), 
                  controller); 

     var result = controller.Execute() as ViewResult; 

... la méthode d'action est l'exécution, mais les événements ne sont pas appelés.

+1

Je ne vois pas que vous avez réellement attaché aux événements ... comment savez-vous qu'ils ne sont pas en cours d'exécution? – jrista

+0

Mode débogage et points d'arrêt – Lullaby

Répondre

15

Ceci est l'une des séparation des préoccupations principes de MVC. Lorsque vous testez une méthode à l'unité, vous testez la méthode elle-même indépendamment des filtres qui y sont appliqués. (Et OnException() et OnActionExecuting() sont vraiment juste des filtres glorifiés.)

Si vous souhaitez tester ces autres méthodes indépendamment, vous êtes libre de le faire. Normalement, la façon dont vous iriez à ce sujet est en appelant les filtres comme ceci:

((IActionFilter)controller).OnActionExecuting(...) 
((IExceptionFilter)controller).OnException(...) 

Vous devez créer des objets contexte pour passer à ces méthodes. À la fin, vous avez trois tests unitaires: un pour OnActionExecuting(), un pour OnException(), et un pour la méthode réelle que vous testez. La bonne chose à propos de cette configuration est qu'une fois que vous avez testé les filtres une fois, vous n'avez plus à vous en soucier pour les autres tests unitaires. Par exemple, si vous avez un Method1(), Method2() et Method3(), vous n'avez pas besoin de tester chaque combinaison de méthodes + filtres. Il suffit d'avoir cinq tests unitaires: OnActionExecuting(), OnException(), Method1(), Method2() et Method3(). Cela élimine les tests redondants et facilite le suivi des bogues potentiels dans votre code.