2010-05-20 5 views
5

Actualmente estoy tratando de comprender MSpec, principalmente para aprender nuevas formas de (T/B) DD para poder tomar una decisión informada sobre qué tecnología usar. Anteriormente, en su mayoría (solo lectura) usaba el framework MSTest integrado con Moq, entonces BDD es bastante nuevo para mí.Prueba ActionFilterAttributes con MSpec

Estoy escribiendo una aplicación ASP.NET MVC, y quiero implementar PRG. La última vez que hice esto, utilicé filtros de acción para exportar e importar ModelState a través de TempData, para poder devolver un RedirectResult y los errores de validación aún estarían allí cuando el usuario obtuviera la vista. Probé ese escenario mediante la verificación de dos cosas:

a) Que la ExportModelStateAttribute que había escrito se aplicó (entre las pruebas para mi regulador)
b) que el atributo trabajado (entre las pruebas para el filtro de acción de los atributos)

Sin embargo, en BDD he entendido que debería estar aún más preocupado con el comportamiento, y aún menos con la implementación. Esto significa que probablemente debería verificar que el estado del modelo esté en tempdata cuando la acción haya terminado de ejecutarse, no necesariamente que se realice a través de un atributo.

Para complicar aún más las cosas, los atributos no se ejecutan al llamar la acción directamente en la prueba, por lo que no puedo simplemente llamar a la acción y ver si el trabajo se ha realizado.

¿Cómo debo especificar/probar esto en MSpec?

Respuesta

1

Los filtros son problemas de corte transversal y, como tal, debe probar el comportamiento del filtro independientemente de donde se aplica (de lo contrario, duplicará muchas pruebas).

Aún puede expresar el comportamiento deseado en las pruebas de su controlador (el estado del modelo se almacena en datos temporales), pero la prueba puede afirmar la existencia del atributo (¿podría estar encapsulado en un comportamiento a?).

Como nota adicional: ASP.NET MVC está diseñado con la convención de devolver la vista si el estado del modelo contiene errores. El uso de PRG en estos escenarios tiene sentido ya que PRG está diseñado para detener el envío y procesamiento de formularios duplicados (es decir, de una solicitud válida). Cuando un usuario publica un formulario no válido, verifica si hay errores antes de comenzar a procesar la solicitud y, por lo tanto, impide que se procese la solicitud de los usuarios.

+0

OK. Entonces, básicamente, lo que usted recomienda es que defina un comportamiento que diga "stores_model_state_in_temp_data" pero en realidad solo comprueba que se aplica el atributo y luego defina las pruebas para el atributo en un contexto de prueba completamente diferente. –

+0

Sí. Probar el comportamiento esperado (el qué) muchas veces y la implementación de ese behiour (el cómo) una vez. – Neal

+0

OK. Ahora, un problema de seguimiento: en mi antigua manera de probar si se aplicaba un atributo, usé la reflexión y pasé una Expresión y un Tipo al método de prueba. Al especificar un comportamiento, no puedo encontrar una manera de pasar estos argumentos. (El Tipo se puede resolver simplemente haciendo que la clase de comportamiento sea genérica o algo así, pero aún necesito una lambda ...) ¿Cómo hago eso? –

Cuestiones relacionadas