Для базового определения TDD вы пишете провальный тест, пишете минимальный объем кода, который сделает тест успешным, рефакторинг, повтор. Там не так много места для отсрочки рефакторинга. ;)
Я думаю, что это так по многим причинам, главным образом, чтобы люди, подобные моему боссу, не были правы, полагая, что слово «рефакторинг» - это выговорное кодовое слово для переписывания. Насколько проще написать один метод, который, скажем, захватывает некоторую информацию из Интернета. Вы пишете свой тест, заставляете его пройти, затем говорите: «Хорошо, теперь возьмите этот жестко закодированный URL и переместите его в начало класса или файла свойств». Насколько сложнее это сделать после того, как вы закончили свой урок и взвесили несколько сотен или более строк кода.
Там, где появляется проектная часть, это меньше в большом «D» esign, по крайней мере, в моем понимании и использовании TDD, а скорее в передовой практике, которую он поощряет и / или требует. Возвращаясь к моему сценарию использования, хорошо, у меня написан метод для сбора моих данных, теперь мне нужно что-то с ним сделать, могу ли я вернуться и начать добавлять код в мой метод getData? Нет, конечно нет, это "сделано". Я продолжаю и пишу новый метод или три, чтобы сделать что-то с данными. Все методы коротки, по заданию, тестируемы, короче говоря, гораздо лучший дизайн для кода.
Я думаю, что именно здесь возникает путаница. TDD производит лучше разработанный CODE, который, вероятно, будет производить лучшее программное обеспечение, но если общий дизайн SYSTEM не годится, то лучшие методы кодирования во вселенной не собираются создавать хороший продукт / система.
YMMV конечно.