Prefiere las pruebas a la interfaz en lugar de las pruebas en la implementación.
Tengo entendido que los métodos privados no se pueden probar
Esto depende de su entorno de desarrollo, vea más abajo.
[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 re-factor. Debería ser posible modificar el factor sin cambiar la interfaz o el comportamiento de 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í crear un objeto que solo tenga métodos privados e interactúe con otros objetos escuchando sus eventos. Esto sería muy encapsulado, pero completamente imposible de probar.
Incluso si la clase no tiene métodos públicos, sus controladores de eventos son interfaz pública , y es contra que interfaz pública puedo probar.
Dado que los eventos son la interfaz, son los eventos que necesitarás generar para probar ese objeto.
Considere utilizar objetos simulados como pegamento para su 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 del receptor).
Además, se considera una mala práctica agregar métodos para realizar pruebas.
Absolutamente, debes ser muy cauteloso al exponer el estado interno.
¿Esto significa que TDD está en desacuerdo con la encapsulación? ¿Cuál es el saldo apropiado?
Absolutamente no.
TDD no debería cambiar la implementación de sus clases para no simplificarlas (aplicando YAGNI desde un punto anterior).
La mejor práctica con TDD es idéntica a la mejor práctica sin TDD, simplemente descubra por qué antes, porque está utilizando la interfaz a medida que la desarrolla.
Me inclino a hacer que la mayoría o todos mis métodos sean públicos ahora ...
Esto sería más bien arrojar al bebé con el agua del baño.
No deberías necesitar hacer públicos todos los métodos para que puedas desarrollarlos de forma TDD. Vea mis notas a continuación para ver si sus métodos privados realmente no se pueden probar.
Una mirada más detallada sobre la prueba de métodos privados
Si absolutamente debe la unidad prueba algunos comportamientos privados de una clase, dependiendo del idioma / entorno, puede tener tres opciones:
- Coloque las pruebas en la clase que desea evaluar.
- Coloque las pruebas en otra clase / archivo fuente & exponga los métodos privados que desea probar como métodos públicos.
- Use un entorno de prueba que le permita mantener los códigos de prueba y producción separados, y al mismo tiempo permitir el acceso de 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) Coloque las pruebas en la clase que desea probar (no ideal)
El almacenamiento de casos de prueba en la misma clase / archivo 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 de preprocesador, terminará con el código de prueba hinchando 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. / p>
2) Exponga los métodos privados que desea probar como métodos públicos (en realidad no es una buena idea)
Como se sugiere, esta es una práctica muy deficiente, 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 de Eclipse, 3. se puede lograr utilizando fragmentos . En el mundo C #, podríamos usar clases parciales . Otros idiomas / entornos a menudo tienen una funcionalidad similar, solo necesitas encontrarla.
Suponiendo que 1. o 2. son las únicas opciones que podrían resultar en un software de producción inflado con código de prueba o interfaces de clase desagradables que lavan su ropa sucia en público. * 8 ')
- Sin embargo, en general, es mucho mejor no probar la implementación privada.