Hoje eu escrevo teste para as aplicações, mas não o TDD. Eu costumo fazer meus códigos da seguinte forma.
1 - Escrevo Tudo, sem muita arquitetura, separação de responsabilidade, nem nada disso, apenas codifico um linguição para ver se tudo que foi pensado irá funcionar.
2 - Funcionou tudo que previ, agora começo gerenciar o código (criar services, repositories, dependency injection, middleware se necessário, separar os métodos para unica responsabilidade, etc).
3 - Com os métodos possuindo uma unica responsabilidade começo pensar nos possiveis testes (nesse momento encontro alguns cenários que falha e vou corrigindo o código).
4 - Por fim passando todos os testes está pronto para o PR.
Eu fazia bem dessa forma que você comentou. Mas com o tempo experimentei inverter um pouco a ordem.
Antes de refatorar o código( criar as camadas e separar as responsabilidades ) eu tento criar alguns testes e após ter esses testes passando, vou pegando cada cenário do teste e vou ajustando e rodando o teste.
Dessa maneira eu tenho a garantia que o resultado esperado sempre será o mesmo.