2009-03-04 35 views
7

Hay un ActionFilter en mi clase de controlador. Se llama al método OnActionExecuting cuando se llama a una acción del controlador en una aplicación web.¿Cómo pruebo un ActionFilter en ASP.NET MVC?

Ahora me llaman el Action en un unittest:

NiceController niceController = new NiceController(); 
    ActionResult result = niceController.WhateverAction(); 

¿Hay una manera de tener la ActionFilter llamada?

Respuesta

9

Con el fin de tener la ActionFilter llamada automática, que van a necesitar para ejecutar la acción del controlador invocador. Esto es posible, pero significa que el marco MVC intentará y ejecutará el resultado. Esto significa que tendría que usar simulaciones para anular la ejecución del resultado. De nuevo, eso es posible, pero significa que su prueba unitaria se está volviendo más burlona que el código real. Puede ser más correcto probar el filtro directamente. Después de todo, el hecho de que se llame a OnActionExecuting es una característica del framework, y no es necesario probar el framework por sí mismo.

pero creo que lo que realmente está diciendo es que desea probar WhateverAction, y que la acción no puede trabajar a menos que el ActionFilter ha ejecutado.

En primer lugar, me gustaría hacer preguntas sobre este diseño. ¿Es esto correcto? Podría ser. Es razonable, por ejemplo, que una acción con el atributo Autorizar suponga que cuando se ejecuta hay un usuario conectado. Por supuesto, la acción debería probar esto, pero la presunción es segura. Por otro lado, las acciones probablemente no requieran filtros para realizar una inicialización específica de la acción. Entonces debería hacer la pregunta, pero la respuesta es que el diseño es correcto.

En este caso, la mejor decisión para una prueba unitaria podría ser ejecutar manualmente el filtro en la prueba de unidad, y escribir una prueba de unidad separada que pruebe que la acción está decorada con el atributo correcto.

+0

más información: http : //stackoverflow.com/questions/10197677/how-to-test-that-a-method-argument-is-decorated-with-an-attribute – Spock

0

para escribir una prueba de unidad separada, que demuestra que la acción está decorado con el atributo correcto

aquí es cómo se puede escribir una prueba de dicha unidad

Type t = typeof(MyController); 
Assert.IsTrue(t.GetCustomAttributes(typeof(MyCustomAttribute)).Length > 0); 
Cuestiones relacionadas