Una prueba de unidad de controlador debe probar los algoritmos de código en sus métodos de acción, no en su capa de datos. Esta es una razón para burlarse de esos servicios de datos. El controlador espera recibir ciertos valores de repositorios/servicios/etc., y actuar de manera diferente cuando recibe información diferente de ellos.
Escribe pruebas unitarias para afirmar que el controlador se comporta de forma muy específica en situaciones/circunstancias muy específicas. Su capa de datos es una parte de la aplicación que proporciona esas circunstancias al controlador/métodos de acción. Afirmar que el controlador llamó a un método de servicio es valioso porque puede estar seguro de que el controlador obtiene la información de otro lugar.
Comprobar el tipo del modelo de vista devuelto es valioso porque, si se devuelve el tipo de modelo de vista incorrecto, MVC emitirá una excepción de tiempo de ejecución. Puede evitar que esto suceda en producción ejecutando una prueba unitaria. Si la prueba falla, entonces la vista puede lanzar una excepción en producción.
Las pruebas unitarias pueden ser valiosas porque hacen que la refabricación sea mucho más fácil. Puede cambiar la implementación y afirmar que el comportamiento sigue siendo el mismo asegurándose de que todas las pruebas de la unidad pasen.
respuesta al comentario # 1
Si el cambio de la puesta en práctica de un llamadas bajo prueba método para el cambio/eliminación de un método burlado de capa inferior, entonces la unidad de prueba debe también cambiar. Sin embargo, esto no debería ocurrir tan a menudo como creas.
El típico flujo de trabajo de refactorización rojo-verde requiere la escritura de las pruebas de su unidad antes de escribiendo los métodos que prueban. (Esto significa que durante un breve período de tiempo, su código de prueba no se compilará, y es por eso que muchos desarrolladores jóvenes/inexpertos tienen dificultades para adoptar el refactor verde rojo.)
Si escribe las pruebas de su unidad primero, llegará a un punto donde sabes que el controlador necesita obtener información de una capa inferior. ¿Cómo puede estar seguro de que intenta obtener esa información? Burlando del método de capa inferior que proporciona la información, y afirmando que el método de capa inferior es invocado por el controlador.
Es posible que haya escrito mal cuando utilicé el término "cambio de implementación". Cuando el método de acción & de un controlador se debe modificar la prueba de unidad correspondiente para cambiar o eliminar un método simulado, realmente se está cambiando el comportamiento del controlador.Refactorizar, por definición, significa cambiar la implementación sin alterar el comportamiento general y los resultados esperados.
Red-green-refactor es un enfoque de Control de calidad que ayuda a prevenir errores & defectos en el código antes de que aparezcan. Normalmente, los desarrolladores cambian la implementación para eliminar errores después de que aparecen. Entonces, para reiterar, los casos que te preocupan no deberían suceder tan a menudo como crees.
Estoy de acuerdo con mucho de lo que dices, pero no entiendo cómo la prueba unitaria puede ayudar cuando se cambia la aplicación (el último punto) si requiere que la implementación llame a ciertos métodos de nivel inferior (su segundo punto). – ChaseMedallion
Todavía no estoy totalmente de acuerdo con la idea de probar que una función llama a otra función, pero entiendo de dónde vienes cuando lo piensas desde la perspectiva de "probar primero". Además, probablemente tenga razón en que, en muchos casos, un cambio en las llamadas de servicio indica un cambio en el comportamiento del controlador. ¡Gracias por la respuesta muy reflexiva, descriptiva y bien razonada! – ChaseMedallion