Estou tentando entender o TDD, especificamente a parte do desenvolvimento. Eu olhei para alguns livros, mas os que encontrei abordam principalmente a parte dos testes - a História do NUnit, por que o teste é bom, Vermelho / Verde / Refator e como criar uma Calculadora de Cordas.
Coisas boas, mas isso é "apenas" Teste de Unidade, não TDD. Especificamente, não entendo como o TDD me ajuda a obter um bom design se precisar de um Design para começar a testá-lo.
Para ilustrar, imagine estes três requisitos:
- Um catálogo precisa ter uma lista de produtos
- O catálogo deve lembrar quais produtos um usuário visualizou
- Os usuários devem poder procurar um produto
A essa altura, muitos livros tiram um coelho mágico do chapéu e apenas mergulham em "Testando o ProductService", mas eles não explicam como chegaram à conclusão de que existe um ProductService em primeiro lugar. Essa é a parte "Desenvolvimento" no TDD que estou tentando entender.
Precisa haver um design existente, mas coisas fora dos serviços da entidade (ou seja: Existe um Produto, portanto deve haver um ProductService) não podem ser encontradas (por exemplo, o segundo requisito exige que eu tenha algum conceito de Usuário, mas onde eu lembraria a funcionalidade? E a Pesquisa é um recurso do ProductService ou um SearchService separado? Como saberia qual devo escolher?)
De acordo com o SOLID , eu precisaria de um UserService, mas se eu projetar um sistema sem TDD, posso acabar com um monte de serviços de método único. O TDD não tem a intenção de me fazer descobrir o meu design em primeiro lugar?
Sou desenvolvedor .net, mas os recursos Java também funcionam. Sinto que não parece haver um aplicativo ou livro de amostra real que lide com um aplicativo de linha de negócios real. Alguém pode fornecer um exemplo claro que ilustra o processo de criação de um design usando TDD?