Normalmente, su controlador conecta diferentes objetos y los conecta en el orden correcto. Tal vez él llame a un repositorio, lea algunos objetos y los devuelva a través del método de renderizado. Tal vez él llama a otros Handlers/Managers que hacen cosas.
Esto significa que un controlador es un componente de alto nivel. En la mayoría de los casos, esto indica que las pruebas funcionales están en orden en lugar de las pruebas unitarias. No debe aspirar a obtener una cobertura de código del 100% con las pruebas de su unidad. Tal vez puedas pensarlo de esa manera: si tu unidad prueba todo lo que el controlador llama (modelo, validación, formulario, repositorio), ¿qué podría salir mal? La mayoría de las veces es algo que solo observas cuando usas todas las clases reales involucradas durante la producción.
También quiero señalar que TDD no significa que todo deba ser probado por la unidad. Está bien tener algunas pruebas funcionales para el código de alto nivel. Como se dijo, si prueba los componentes de bajo nivel con pruebas unitarias, solo debe probar cómo funcionan juntos, lo cual no puede probar con simulacros porque le dice a los simulacros cuál es el valor de retorno.
Si su controlador hace algo más que conectar partes del sistema, debería pensar en refaccionar el material en más clases de bajo nivel que pueda probar con pruebas unitarias.
Así que mi sugerencia es para utilizar pruebas funcionales para probar los controladores y utilizar pruebas unitarias para probar sus modelos y su lógica de negocios.
Si usted lucha con las pruebas funcionales, se puede leer lo siguiente:
¿Cuál es exactamente el problema con que devolver un objeto 'Response'? –
Nada. Simplemente no me gusta el hecho de que se crea un objeto Response en un controlador. Soy un firme creyente de Dependency Injection, y odio ver la palabra clave "nueva" en cualquier cosa que no sea un contenedor DI. Tal vez esa creencia es incorrecta. –