Sejauh yang saya pahami, kebanyakan orang tampaknya setuju bahwa metode pribadi tidak boleh diuji secara langsung, melainkan melalui metode publik apa pun menyebutnya. Saya dapat melihat poin mereka, tetapi saya memiliki beberapa masalah dengan ini ketika saya mencoba untuk mengikuti "Tiga Hukum TDD", dan menggunakan siklus "Merah-hijau-refaktor". Saya pikir itu paling baik dijelaskan dengan sebuah contoh:
Saat ini, saya memerlukan program yang dapat membaca file (berisi data yang dipisahkan tab) dan memfilter semua kolom yang berisi data non-numerik. Saya kira mungkin ada beberapa alat sederhana yang sudah tersedia untuk melakukan ini, tetapi saya memutuskan untuk mengimplementasikannya sendiri dari awal, terutama karena saya pikir itu bisa menjadi proyek yang bagus dan bersih bagi saya untuk mendapatkan beberapa latihan dengan TDD.
Jadi, pertama, saya "memakai topi merah", yaitu, saya perlu tes yang gagal. Saya pikir, saya akan membutuhkan metode yang menemukan semua bidang non-numerik dalam satu baris. Jadi saya menulis tes sederhana, tentu saja gagal untuk mengkompilasi segera, jadi saya mulai menulis fungsi itu sendiri, dan setelah beberapa siklus bolak-balik (merah / hijau) saya memiliki fungsi kerja dan tes lengkap.
Selanjutnya, saya melanjutkan dengan fungsi, "collectNonNumericColumns" yang membaca file, satu baris setiap kali, dan memanggil "findNonNumericFields" saya - fungsi pada setiap baris untuk mengumpulkan semua kolom yang akhirnya harus dihapus. Beberapa siklus merah-hijau, dan saya selesai, memiliki lagi, fungsi kerja dan tes lengkap.
Sekarang, saya pikir saya harus refactor. Karena metode "findNonNumericFields" saya dirancang hanya karena saya pikir saya akan membutuhkannya ketika mengimplementasikan "collectNonNumericColumns", menurut saya masuk akal jika membiarkan "findNonNumericFields" menjadi pribadi. Namun, itu akan merusak tes pertama saya, karena mereka tidak lagi memiliki akses ke metode yang mereka uji.
Jadi, saya berakhir dengan metode pribadi, dan serangkaian tes yang mengujinya. Karena begitu banyak orang menyarankan agar metode pribadi tidak diuji, rasanya seperti saya mengecat diri saya sendiri di sudut sini. Tapi di mana tepatnya aku gagal?
Saya kira saya bisa mulai pada level yang lebih tinggi, menulis tes yang menguji apa yang akhirnya akan menjadi metode publik saya (yaitu, findAndFilterOutAllNonNumericalColumns), tetapi itu terasa agak berlawanan dengan seluruh titik TDD (setidaknya menurut Paman Bob) : Bahwa Anda harus beralih secara konstan antara tes penulisan dan kode produksi, dan bahwa pada titik waktu mana saja, semua tes Anda bekerja dalam satu menit terakhir atau lebih. Karena jika saya memulai dengan menulis tes untuk metode publik, akan ada beberapa menit (atau jam, atau bahkan berhari-hari dalam kasus yang sangat kompleks) sebelum saya mendapatkan semua detail dalam metode pribadi untuk bekerja sehingga tes menguji publik metode berlalu.
Jadi, apa yang harus dilakukan? Apakah TDD (dengan siklus red-green-refactor) tidak kompatibel dengan metode pribadi? Atau ada kesalahan dalam desain saya?
private
olah masuk akal untuk melakukannya.