Я очень скептически отношусь к написанию модульных тестов перед реализацией. Может быть, это было бы эффективно, если бы у вас было хорошее представление о точном дизайне необходимых классов и методов, но, как правило, в начале нового проекта это не так.
Мой предпочтительный подход состоит в том, чтобы признать, что начало нового проекта может быть организованным хаосом. Одна часть процесса проектирования - это написание кода для проверки определенных идей или поиска наилучшего пути. Много времени код попадает в тупик и отбрасывается, и любые написанные для него модульные тесты были бы пустой тратой времени.
Не поймите меня неправильно. Я все за хорошо разработанное программное обеспечение, и в определенный момент важно, чтобы организованный хаос трансформировался в хорошо понятный дизайн. В этот момент структура классов и UML-диаграммы начинают укрепляться. В этом и заключается смысл TDD для меня. Каждый класс должен быть в состоянии быть изолированным. Если дизайн хорош с правильной степенью развязки, то этого легко добиться, обычно разбрызгивая ложные объекты по всему месту. Если дизайн плохой, тестирование становится настоящим кошмаром и, следовательно, игнорируется.
В конце концов, вам нужен высококачественный продуктивный код. Модульные тесты являются одним из лучших инструментов для достижения этой цели, но они не должны жить своей собственной жизнью и стать более важными, чем код, который они тестируют, который иногда возникает из мантры TDD.