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