Prefiere probar a la interfaz a probar en la implementación.
Tengo entendido que los métodos privados no son verificables
Esto depende de su entorno de desarrollo, consulte a continuación.
[los métodos privados] no deberían preocuparse porque la API pública proporcionará suficiente información para verificar la integridad de un objeto.
Así es, TDD se enfoca en probar la interfaz.
Los métodos privados son un detalle de implementación que podría cambiar durante cualquier ciclo de refactorización. Debería ser posible re-factorizar sin cambiar la interfaz o el comportamiento de la caja negra . De hecho, eso es parte del beneficio de TDD, la facilidad con la que puede generar la confianza de que los cambios internos en una clase no afectarán a los usuarios de esa clase.
Bueno, es posible para mí hacer un objeto que solo tenga métodos privados e interactúe con otros objetos escuchando sus eventos. Esto sería muy encapsulado, pero completamente inestable.
Incluso si la clase no tiene métodos públicos, sus controladores de eventos son su interfaz pública , y está en contra de esa interfaz pública que puede probar.
Dado que los eventos son la interfaz, son los eventos que necesitará generar para probar ese objeto.
Considera el uso de objetos simulados como pegamento para tu sistema de prueba. Debería ser posible crear un objeto simulado simple que genere un evento y recoja el cambio de estado resultante (posible por otro objeto simulado receptor).
Además, se considera una mala práctica agregar métodos en aras de las pruebas.
Absolutamente, debe tener mucho cuidado con exponer el estado interno.
¿Esto significa que TDD está en desacuerdo con la encapsulación? ¿Cuál es el equilibrio apropiado?
Absolutamente no.
TDD no debería cambiar la implementación de sus clases más que quizás simplificarlas (aplicando YAGNI desde un punto anterior).
La mejor práctica con TDD es idéntica a la mejor práctica sin TDD, solo averigua por qué antes, porque está utilizando la interfaz a medida que la desarrolla.
Estoy inclinado a hacer públicos la mayoría o todos mis métodos ahora ...
Esto sería más bien tirar al bebé con el agua del baño.
No debería necesitar hacer públicos todos los métodos para poder desarrollarse de forma TDD. Vea mis notas a continuación para ver si sus métodos privados realmente no son verificables.
Una mirada más detallada a la prueba de métodos privados.
Si absolutamente debe probar un poco el comportamiento privado de una clase, dependiendo del idioma / entorno, puede tener tres opciones:
- Ponga las pruebas en la clase que desea evaluar.
- Coloque las pruebas en otra clase / archivo fuente y exponga los métodos privados que desea probar como métodos públicos.
- Use un entorno de prueba que le permita mantener el código de prueba y de producción por separado, y aún así permitir el acceso del código de prueba a métodos privados del código de producción.
Obviamente, la tercera opción es, con mucho, la mejor.
1) Ponga las pruebas en la clase que desea probar (no ideal)
Almacenar casos de prueba en el mismo archivo de clase / fuente que el código de producción bajo prueba es la opción más simple. Pero sin una gran cantidad de directivas o anotaciones previas al procesador, terminará con su código de prueba inflando su código de producción innecesariamente, y dependiendo de cómo haya estructurado su código, puede terminar exponiendo accidentalmente la implementación interna a los usuarios de ese código.
2) Exponga los métodos privados que desea probar como métodos públicos (realmente no es una buena idea)
Como se sugirió, esta es una práctica muy pobre, destruye la encapsulación y expondrá la implementación interna a los usuarios del código.
3) Utilice un mejor entorno de prueba (la mejor opción, si está disponible)
En el mundo Eclipse, 3. se puede lograr mediante el uso de fragmentos . En el mundo C #, podríamos usar clases parciales . Otros idiomas / entornos a menudo tienen una funcionalidad similar, solo necesita encontrarla.
Asumiendo ciegamente que 1. o 2. son las únicas opciones, es probable que el software de producción esté repleto de código de prueba o interfaces de clase desagradables que lavan su ropa sucia en público. * 8 ')
- En general, es mucho mejor no probar contra la implementación privada.