наскільки я розумію, більшість людей, мабуть, згодні з тим, що приватні методи не повинні бути перевірені безпосередньо, а скоріше через те, що їх називають публічні методи. Я бачу їхню суть, але у мене є деякі проблеми з цим, коли я намагаюся дотримуватися "трьох законів TDD" і використовувати цикл "Червоний - зелений - рефактор". Я думаю, що це найкраще пояснюється прикладом:
Зараз мені потрібна програма, яка може прочитати файл (містить дані, розділені на вкладки) та відфільтрувати всі стовпці, що містять нечислові дані. Я думаю, що, мабуть, вже є кілька простих інструментів для цього, але я вирішив реалізувати це з нуля, здебільшого тому, що я вважав, що це мій і приємний проект для мене, щоб отримати практику з TDD.
Отже, по-перше, я "надягнув червону шапку", тобто мені потрібен тест, який не вдається. Я зрозумів, що мені знадобиться метод, який знайде всі нечислові поля в рядку. Тож я пишу простий тест, звичайно, його не вдається скласти відразу, тому я починаю писати саму функцію, і через пару циклів вперед і назад (червоний / зелений) у мене є робоча функція і повний тест.
Далі я продовжую функцію "збиратиNonNumericColumns", яка читає файл, по одному рядку, і викликає мою функцію "findNonNumericFields" у кожному рядку, щоб зібрати всі стовпці, які з часом повинні бути видалені. Пару червоно-зелених циклів, і я закінчив, маючи знову робочу функцію і повний тест.
Тепер, я думаю, я повинен рефактор. Оскільки мій метод "findNonNumericFields" був розроблений лише тому, що я вважав, що він мені знадобиться при впровадженні "createNonNumericColumns", мені здається, було б розумно дозволити "findNonNumericFields" стати приватними. Однак це призведе до порушення моїх перших тестів, оскільки вони більше не матимуть доступу до методу, який вони тестували.
Отже, я закінчую приватними методами та набором тестів, які перевіряють його. Оскільки так багато людей радить, що приватні методи не слід перевіряти, відчувається, що я намалював себе у куточок. Але де саме я провалився?
Я вважаю, що я міг би почати з вищого рівня, написавши тест, який перевіряє те, що з часом стане моїм публічним методом (тобто, findAndFilterOutAllNonNumericalColumns), але це відчуває дещо протилежність всій точці TDD (принаймні, за словами дядька Боба) : Ви повинні постійно перемикатися між написанням тестів і виробничим кодом, і щоб у будь-який момент часу всі ваші тести працювали протягом останньої хвилини або близько того. Тому що, якщо я розпочну з написання тесту для публічного методу, буде кілька хвилин (або годин, а то й днів у дуже складних випадках), перш ніж я отримаю всі деталі приватних методів для роботи, щоб тест тестував публічну метод проходить.
Отже, що робити? Чи TDD (із швидким циклом червоно-зеленого рефактора) просто не сумісний із приватними методами? Або є помилка в моєму дизайні?
private
ніби це має сенс робити.