Saya memiliki kelas yang refactored dalam 1 kelas utama dan 2 kelas lebih kecil. Kelas-kelas utama menggunakan database (seperti banyak kelas saya lakukan) dan mengirim email. Jadi kelas utama memiliki IPersonRepository
dan IEmailRepository
menyuntikkan yang pada gilirannya mengirim ke 2 kelas yang lebih kecil.
Sekarang saya ingin menguji unit kelas utama, dan telah belajar untuk tidak melepas pekerjaan internal kelas, karena kita harus dapat mengubah kerja internal tanpa melanggar tes unit.
Tetapi karena kelas menggunakan IPersonRepository
dan IEmailRepository
, saya HARUS menentukan hasil (tiruan / tiruan) untuk beberapa metode untuk IPersonRepository
. Kelas utama menghitung beberapa data berdasarkan data yang ada dan mengembalikannya. Jika saya ingin menguji itu, saya tidak melihat bagaimana saya bisa menulis tes tanpa menentukan bahwa IPersonRepository.GetSavingsByCustomerId
pengembalian x. Tapi kemudian unit test saya 'tahu' tentang cara kerja internal, karena 'tahu' metode mana yang harus diejek dan mana yang tidak.
Bagaimana saya bisa menguji kelas yang telah menyuntikkan dependensi, tanpa tes mengetahui tentang internal?
Latar Belakang:
Dalam pengalaman saya banyak tes seperti ini membuat tiruan untuk repositori dan kemudian memberikan data yang tepat untuk mengejek atau menguji apakah metode tertentu dipanggil selama eksekusi. Either way, tes tahu tentang internal.
Sekarang saya telah melihat presentasi tentang teori (yang saya dengar sebelumnya) bahwa tes tidak boleh tahu tentang implementasinya. Pertama karena Anda tidak menguji cara kerjanya, tetapi juga karena ketika Anda sekarang mengubah implementasi semua tes unit gagal karena mereka 'tahu' tentang implementasi. Sementara saya suka konsep pengujian tidak menyadari implementasi, saya tidak tahu bagaimana mencapainya.
IPersonRepository
objek, antarmuka itu dan semua metode yang dijelaskannya tidak "internal" lagi, jadi itu bukan masalah tes. Pertanyaan Anda semestinya adalah "bagaimana saya bisa mengubah kelas menjadi unit yang lebih kecil tanpa mengekspos terlalu banyak di depan umum". Jawabannya adalah "menjaga antarmuka yang ramping" (dengan berpegang teguh pada prinsip pemisahan antarmuka, misalnya). Itulah IMHO titik 2 dalam jawaban @ DavidArno (saya kira tidak perlu bagi saya untuk mengulanginya di jawaban lain).