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?
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. –
Sí. Probar el comportamiento esperado (el qué) muchas veces y la implementación de ese behiour (el cómo) una vez. – Neal
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? –