Todos os exemplos que li e vi nos vídeos de treinamento têm exemplos simplistas. Mas o que eu não vejo se como faço o código "real" depois de ficar verde. Esta é a parte "Refatorar"?
Se eu tiver um objeto bastante complexo com um método complexo, e escrever meu teste e o mínimo necessário para fazê-lo passar (depois que ele falhar pela primeira vez, vermelho). Quando eu volto e escrevo o código real? E quanto código real eu escrevo antes de testar novamente? Suponho que o último seja mais intuição.
Edit: Obrigado a todos que responderam. Todas as suas respostas me ajudaram imensamente. Parece haver idéias diferentes sobre o que eu estava perguntando ou confuso, e talvez exista, mas o que eu estava perguntando era: digamos que tenho um aplicativo para a construção de uma escola.
No meu design, tenho uma arquitetura com a qual quero começar, Histórias de usuários, e assim por diante. A partir daqui, pego essas histórias de usuário e crio um teste para testar a história de usuário. O usuário diz: Temos pessoas matriculadas na escola e pagamos taxas de inscrição. Então, penso em uma maneira de fazer isso falhar. Ao fazer isso, criei uma classe de teste para a classe X (talvez Student), que falhará. Eu então crio a classe "Aluno". Talvez "Escola" eu não sei.
Mas, de qualquer forma, o TD Design está me forçando a pensar na história. Se posso fazer um teste falhar, sei por que ele falha, mas isso pressupõe que eu possa fazer passar. É sobre o design.
Eu comparo isso a pensar em recursão. Recursão não é um conceito difícil. Pode ser mais difícil realmente acompanhar isso em sua mente, mas, na realidade, a parte mais difícil é saber quando a recursão "quebra", quando parar (minha opinião, é claro). Então, tenho que pensar no que para a recursão primeiro. É apenas uma analogia imperfeita, e assume que cada iteração recursiva é um "passe". Mais uma vez, apenas uma opinião.
Na implementação, a escola é mais difícil de ver. Os ledgers numéricos e bancários são "fáceis" no sentido de que você pode usar aritmética simples. Eu posso ver a + b e retornar 0, etc. No caso de um sistema de pessoas, tenho que pensar mais sobre como implementá- lo. Eu tenho o conceito de falha, aprovação, refatoração (principalmente por causa do estudo e dessa pergunta).
O que eu não sei é baseado na falta de experiência, na minha opinião. Não sei como deixar de inscrever um novo aluno. Eu não sei como falhar alguém digitando um sobrenome e sendo salvo em um banco de dados. Eu sei como fazer um +1 para matemática simples, mas com entidades como uma pessoa, não sei se estou apenas testando para ver se recebo de volta um ID exclusivo do banco de dados ou outra coisa quando alguém digita um nome em um banco de dados ou ambos ou nenhum.
Ou, talvez isso mostre que ainda estou confuso.