Todos los ejemplos que he leído y visto en videos de capacitación tienen ejemplos simplistas. Pero lo que no veo es cómo hago el código "real" después de que me ponga verde. ¿Es esta la parte "Refactor"?
Si tengo un objeto bastante complejo con un método complejo, y escribo mi prueba y el mínimo necesario para que pase (después de que falla por primera vez, Rojo). ¿Cuándo regreso y escribo el código real? ¿Y cuánto código real escribo antes de volver a probar? Supongo que la última es más intuición.
Editar: Gracias a todos los que respondieron. Todas sus respuestas me ayudaron inmensamente. Parece que hay diferentes ideas sobre lo que estaba preguntando o confundido, y tal vez sí, pero lo que estaba preguntando era, digamos que tengo una solicitud para construir una escuela.
En mi diseño, tengo una arquitectura con la que quiero comenzar, Historias de usuarios, etc. A partir de aquí, tomo esas historias de usuario y creo una prueba para probar la historia de usuario. El usuario dice: "Tenemos personas que se matriculan en la escuela y pagan tarifas de inscripción" Entonces, pienso en una manera de hacer que eso falle. Al hacerlo, diseño una clase de prueba para la clase X (tal vez Estudiante), que fallará. Luego creo la clase "Estudiante". Tal vez "Escuela" no lo sé.
Pero, en cualquier caso, el diseño de TD me está obligando a pensar en la historia. Si puedo hacer que una prueba falle, sé por qué falla, pero esto presupone que puedo aprobarla. Se trata del diseño.
Comparo esto con pensar en la recursión. La recursión no es un concepto difícil. Puede ser más difícil seguirlo en la cabeza, pero en realidad, lo más difícil es saber cuándo "se rompe" la recursión, cuándo parar (mi opinión, por supuesto). Así que tengo que pensar qué se detiene. La recursividad primero. Es solo una analogía imperfecta, y supone que cada iteración recursiva es un "paso". De nuevo, solo una opinión.
En la implementación, la escuela es más difícil de ver. Los libros de contabilidad numéricos y bancarios son "fáciles" en el sentido de que puede usar aritmética simple. Puedo ver a + b y devolver 0, etc. En el caso de un sistema de personas, tengo que pensar más en cómo implementar eso. Tengo el concepto de reprobar, aprobar, refactorizar (principalmente debido al estudio y esta pregunta).
Lo que no sé se basa en la falta de experiencia, en mi opinión. No sé cómo dejar de inscribir a un nuevo estudiante. No sé cómo fallarle a alguien que escribe un apellido y se guarda en una base de datos. Sé cómo hacer un + 1 para matemáticas simples, pero con entidades como una persona, no sé si solo estoy probando para ver si recupero una identificación única de la base de datos o algo más cuando alguien ingresa un nombre en un base de datos o ambos o ninguno.
O, tal vez esto muestra que todavía estoy confundido.