por lo que yo entiendo, la mayoría de la gente parece estar de acuerdo en que los métodos privados no deben probarse directamente, sino a través de cualquier método público que los llame. Puedo ver su punto, pero tengo algunos problemas con esto cuando trato de seguir las "Tres leyes de TDD", y uso el ciclo "Rojo - verde - refactor". Creo que se explica mejor con un ejemplo:
En este momento, necesito un programa que pueda leer un archivo (que contiene datos separados por tabulaciones) y filtrar todas las columnas que contienen datos no numéricos. Supongo que probablemente ya hay algunas herramientas simples disponibles para hacer esto, pero decidí implementarlo desde cero, principalmente porque pensé que podría ser un proyecto agradable y limpio para mí para poder practicar con TDD.
Entonces, primero, "me pongo el sombrero rojo", es decir, necesito una prueba que falla. Pensé, necesitaré un método que encuentre todos los campos no numéricos en una línea. Así que escribo una prueba simple, por supuesto que no se compila de inmediato, así que comienzo a escribir la función en sí misma, y después de un par de ciclos de ida y vuelta (rojo / verde) tengo una función de trabajo y una prueba completa.
A continuación, continúo con una función, "gatherNonNumericColumns" que lee el archivo, una línea a la vez, y llama a mi función "findNonNumericFields" en cada línea para reunir todas las columnas que eventualmente deben eliminarse. Un par de ciclos rojo-verde, y he terminado, teniendo de nuevo, una función de trabajo y una prueba completa.
Ahora, me imagino que debería refactorizar. Como mi método "findNonNumericFields" se diseñó solo porque pensé que lo necesitaría al implementar "gatherNonNumericColumns", me parece que sería razonable dejar que "findNonNumericFields" se vuelva privado. Sin embargo, eso rompería mis primeras pruebas, ya que ya no tendrían acceso al método que estaban probando.
Entonces, termino con métodos privados y una serie de pruebas que lo prueban. Dado que tanta gente aconseja que no se deben probar los métodos privados, parece que me he metido en un rincón aquí. Pero, ¿dónde exactamente fallé?
Supongo que podría haber comenzado en un nivel superior, escribiendo una prueba que pruebe lo que eventualmente se convertirá en mi método público (es decir, encontrarAndFilterOutAllNonNumericalColumns), pero eso se siente un tanto contrario a todo el punto de TDD (al menos según Tío Bob): que debes cambiar constantemente entre las pruebas de escritura y el código de producción, y que, en cualquier momento, todas tus pruebas funcionaron en el último minuto. Porque si comienzo escribiendo una prueba para un método público, pasarán varios minutos (u horas, o incluso días en casos muy complejos) antes de que todos los detalles de los métodos privados funcionen para que la prueba que prueba al público el método pasa.
Entonces, ¿qué hacer? ¿Es TDD (con el rápido ciclo de refactor rojo-verde) simplemente no es compatible con los métodos privados? ¿O hay una falla en mi diseño?