17

He estado usando TDD durante varios meses, ahora me gustaría aprender a probar mis Controladores (MVC).¿Debo probar mis controladores (MVC)?

Las pruebas de unidad se realizan probando la unidad más pequeña de cada funcionalidad. A veces, los controladores no son pequeños. Captan datos de los Modelos y los pasan a las vistas.

¿Cómo debo probar la unidad de un controlador? ¿Debería burlarme de las dependencias del controlador?

¿Las pruebas de los controladores se consideran pruebas de integración?

Gracias.

Respuesta

2

La misma pregunta formulada ayer:

Does it make sense to test controllers

Y en mi opinión - Sí, hay que tener sentido para probar los controladores. Puede:

  • servicios simulacros detrás de ellos, por lo que es fácil poner a prueba sólo los controladores en sí
  • servicios de licencia unmocked y hacer pruebas de integración, así
+0

¿Qué significa servicios? – user972959

17

que estoy haciendo TDD durante bastante tiempo . Estoy haciendo TDD con ASP.NET MVC por más de un año.

Empecé con las reglas canónicas: "no hay línea de código sin pruebas de unidad", así que probé todo, incluidos los controladores. Los controladores deben ser probados, este fue uno de los objetivos del framework MVC: hacer que esas cosas sean comprobables.

Para aplicaciones pequeñas que funcionan muy bien. Casi toda la lógica se coloca dentro del controlador, todo muy bien probado.

Pero mientras continué con MVC empecé a cambiar de opinión. Intento mantener los controladores tan delgados como sea posible. Lo ideal es nada más que delegar la llamada a algún objeto comercial y envolver los resultados. El resto es por filtros.

¡Eso funcionó muy bien para mí también! Tengo ahora un objeto comercial que se implementan/prueban por separado, por lo que el controlador es solo un punto de integración. No hay razón para probar el punto de integración ya que es demasiado pequeño.

En cuanto a las pruebas de integración: Todavía no he encontrado la situación, donde realmente la necesito. No olvides que los controladores dependen siempre de las abstracciones que inyectas por constructor. Siempre y cuando tengas buenas suposiciones sobre cómo funcionan estas abstracciones, creas pruebas unitarias adecuadas. Como fallaste, solo corrigaste las pruebas unitarias.

Las pruebas de integración son importantes y útiles, pero intento crear las menos posibles.

+0

Primero escribe la prueba de su modelo, ¿verdad? ¿Cuándo escribes pruebas de integración? ¿Puedes citar un ejemplo? – user972959

5

Tomo el mismo enfoque para los controladores que Alexander B. Mis controladores son delgados y tontos. Sin embargo, sigo escribiendo pruebas para asegurarme de que están llamando correctamente a los objetos comerciales o de servicio y que pasan los parámetros correctos.

Esto probablemente se ilustra mejor con un error real que finalmente capté la semana pasada. Tengo un controlador que permite a los gerentes aprobar o rechazar solicitudes de los usuarios, tiene dos vistas, una vista de lista de solicitudes pendientes y una vista de detalles para cada solicitud. Ambas vistas pueden aprobar o denegar. El servicio al que llama el controlador tiene muchos otros métodos expuestos, incluido uno para cambiar el estado de las solicitudes ...puedes ver a dónde va esto. La vista de lista llamaba al método correcto para aprobar o denegar y activar el flujo de trabajo, la vista de detalles solo llamaba al método de estado de cambio y no iniciaba ningún otro flujo de trabajo. Este fue mi error de codificación, pero durante toda mi vida no pude verlo durante siglos: el flujo de trabajo se ejecuta en hilos de fondo, y pasé una semana corriendo por esos hilos, suponiendo que era un error en esa sección.

Así que para mí

  • Tan pronto como el controlador pasa los datos en otro lugar que precisa de pruebas.
  • Si su controlador verifica la validez del modelo que necesita pruebas (¿y si alguien retirado el cheque?)

etc.

+0

come one Paris no es tan tonto ... – Elisabeth

2

Para desarrollar una prueba unidad para su controlador, el camino natural es simula las interfaces de las que depende el controlador (las 'cosas' que controla, llamémoslas IControllable s). Luego puede verificar que el controlador manipule los objetos controlados de la manera esperada.

Si la interacción entre el controlador y los objetos controlados es complicada, las pruebas de integración dedicadas pueden tener sentido. Por ejemplo, puede haber una serie de clases implementando IControllable - ¿funcionarán todas estas implementaciones juntas muy bien con el controlador? Tal vez interactúen múltiples IControllables diferentes (use el mismo recurso)? ¿O el IControllables puede tener formas complicadas de configurarlas afectando su comportamiento? Una forma de probar esto es escribir un conjunto de pruebas reutilizables en el que se bombea en una gama de implementaciones IControllable sospechosas o combinaciones de ellas.

Por último pero no menos importante, TDD es aproximadamente prueba de aceptación también. Por lo tanto, al hacer TDD también tendrá una prueba de extremo a extremo de alto nivel para ejecutar los escenarios que un usuario final reconocería. Lo más probable es que estos también ejerzan el controlador, de esa manera también probando la integración adecuada entre su controlador y (ciertas) clases.

Cuestiones relacionadas