7

Quiero probar el evento OnException, OnActionExecuted de un controlador MVC.¿Cómo puedo probar un evento de un controlador MVC?

si uso simulacro de la siguiente manera:

 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; 

... el método de acción está ejecutando, pero los hechos no son invocados.

+1

No veo que te hayas unido a los eventos ... ¿cómo sabes que no se están ejecutando? – jrista

+0

Modo de depuración y puntos de interrupción – Lullaby

Respuesta

15

Esta es una de las separación de las preocupaciones principios de MVC. Cuando prueba un método unitario, está probando el método en sí mismo independientemente de los filtros que se le aplican. (Y OnException() y OnActionExecuting() son realmente solo filtros glorificados.)

Si desea probar esos otros métodos de forma independiente, puede hacerlo. Normalmente, la manera en que se va sobre esto es llamando a los filtros, así:

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

Vas a tener que crear objetos de contexto para pasar a estos métodos. Al final, tiene tres pruebas unitarias: una para OnActionExecuting(), una para OnException() y otra para el método real que está probando. Lo bueno de esta configuración es que una vez que haya probado los filtros una vez, ya no tendrá que preocuparse más por ninguna otra prueba unitaria.

Por ejemplo, si tiene un Método1(), Método2() y Método3(), no necesita probar cada combinación de método + filtro. Simplemente tiene cinco pruebas unitarias: OnActionExecuting(), OnException(), Method1(), Method2() y Method3(). Esto elimina las pruebas redundantes y hace que sea más fácil rastrear posibles errores en su código.

Cuestiones relacionadas