@collin for a long time, I reverse TDD'd everything. As in "write a manually tested version, comment everything out, only reactivate things to make specs pass". Helped me find quite a few edge-cases.
For refactoring and slight extending, I use the "99 bottles of OOP" approach.
Currently, I try to write smaller spike/POCs, write one huge integration spec for it and then build around that pure TDD Legos, as I understand the goal better.