Antes de tudo, o TDD não o força estritamente a escrever código SOLID. Você poderia fazer TDD e criar uma grande bagunça, se quisesse.
Obviamente, conhecer os princípios do SOLID ajuda, porque, caso contrário, você pode simplesmente não ter uma boa resposta para muitos dos seus problemas e, portanto, escrever um código incorreto acompanhado de testes ruins.
Se você já conhece os princípios do SOLID, o TDD o incentivará a pensar sobre eles e usá-los ativamente.
Dito isso, ele não necessariamente cobre todas as letras do SOLID , mas incentiva e promove fortemente a você escrever pelo menos parcialmente o código do SOLID, pois torna as conseqüências de não fazê-lo imediatamente visíveis e irritantes.
Por exemplo:
- Você precisa escrever um código dissociado para simular o que precisa. Isso suporta o princípio de inversão de dependência .
- Você precisa escrever testes claros e curtos para não precisar mudar muito nos testes (que podem se tornar uma grande fonte de ruído de código, caso contrário). Isso suporta o princípio de responsabilidade única .
- Isso pode ser discutido, mas o Princípio de Segregação de Interface permite que as classes dependam de interfaces mais leves que facilitam o acompanhamento e a compreensão da zombaria, porque você não precisa perguntar "Por que esses 5 métodos também não foram zombados?", Ou ainda mais importante, você não tem muitas opções ao decidir qual método simular. Isso é bom quando você realmente não deseja revisar todo o código da classe antes de testá-lo e apenas usar tentativa e erro para obter um entendimento básico de como funciona.
A adesão ao princípio Aberto / Fechado pode ajudar os testes escritos após o código, porque geralmente permite substituir chamadas de serviço externas em classes de teste derivadas das classes em teste. No TDD, acredito que isso não é tão necessário quanto outros princípios, mas posso estar enganado.
A adesão à regra de substituição de Liskov é ótima se você deseja minimizar as alterações para que sua classe receba uma instância não suportada que apenas implementa a mesma interface de tipo estaticamente, mas não é provável que isso aconteça em casos de teste adequados, porque você geralmente não passa em nenhuma classe em teste as implementações reais de suas dependências.
Mais importante, os princípios do SOLID foram criados para incentivá-lo a escrever código mais limpo, mais compreensível e sustentável, assim como o TDD. Portanto, se você faz o TDD corretamente e presta atenção à aparência do seu código e dos seus testes (e não é tão difícil porque você obtém feedback imediato, API e precisão), você pode se preocupar menos com os princípios do SOLID, em geral.