Suatu hari saya membaca sedikit tentang Unit Testing dan saya melihat beberapa contoh di mana orang membuat antarmuka repositori (yaitu IExampleRepository
) dan kemudian membuat repositori nyata ( public class ExampleRepository : IExampleRepository
) dan repositori yang akan digunakan untuk pengujian unit ( FakeExampleRepository : IExampleRepository
).
Dalam IExampleRepository
mereka menerapkan metode yang sama seperti dalam ExampleRepository
, namun dengan pertanyaan Linq yang berbeda.
Apa sebenarnya tujuan di sini? Saya pikir salah satu bagian dari unit menguji kode Anda adalah memastikan bahwa suatu metode berfungsi dengan benar? Tetapi ketika saya menggunakan dua pertanyaan yang sama sekali berbeda, satu untuk 'nyata' dan satu dalam tes, seberapa masuk akal tes ini?
ExampleRepository
, maka yang terbaik adalah menggunakan tiruan. Pembenarannya adalah bahwa Anda tidak menguji unit repositori tetapi sesuatu yang lain.ExampleRepository
, gunakan hal yang nyata. Jika Anda menguji unitRepositoryController
, maka itu hanya harus menggunakanFakeExampleRepository
yang mengembalikan nilai yang ditentukan sebelumnya. Dengan cara ini, jika bug masukExampleRepository
, hanya unit test yang akan gagal -RepositoryController
tes akan terus berhasil, jadi Anda tahu tidak ada bug di sana. Jika controller menggunakan repositori nyata, keduanya akan gagal dan Anda tidak akan tahu apakah Anda memiliki 1 bug atau 2.Saya setuju dengan dua jawaban dari jk. dan Jan Hudec - mereka memberikan informasi yang sangat bagus. Tapi saya pikir saya akan menambahkan sedikit.
Pertanyaan pertama Anda ("Apa sebenarnya tujuan di sini?") Penting. Jika Anda mendeskripsikan, tujuan sebenarnya adalah untuk menguji kelas yang menggunakan
IExampleRepository
antarmuka, bukan menguji implementasi repositori. MembuatFakeExampleRepository
memungkinkan Anda untuk menguji kelas-kelas klien tanpa khawatir tentang rincian kelas repositori nyata.Ini terutama benar jika objek yang Anda coba siapkan membuat pengujian sulit (mis. Mengakses sistem file, memanggil layanan web, atau berbicara ke database). Dengan menggunakan antarmuka (dan teknik lain semacam itu), Anda menjaga kopling tetap rendah. Oleh karena itu, kelas
X
hanya perlu tahu tentang antarmuka dan tidak perlu tahu tentang detail implementasi. Tujuannya adalah memastikan bahwa kelasX
melakukan hal yang benar.Mengejek (atau mematikan, berpura-pura ... ada perbedaan perbedaan) adalah alat yang ampuh untuk pengujian unit dan TDD. Tapi itu bisa menyusahkan untuk secara manual membuat dan memelihara implementasi ini. Oleh karena itu, sebagian besar bahasa sekarang memiliki perpustakaan yang bisa mengejek untuk membantu. Karena Anda menggunakan C #, saya akan merekomendasikan Moq karena sederhana dan sangat kuat. Kemudian Anda dapat menguji antarmuka tanpa menumpuk kode tambahan untuk implementasi tiruan.
sumber
the real objective is to test the classes that are utilizing the IExampleRepository interface
itu tidak sepenuhnya benar. Tujuannya adalah untuk mengujinya secara independen dari IExampleRepository. +1 untuk merekomendasikan kerangka isolasi yang baik.IExampleRepository
karena kelas yang diuji digabungkan ke antarmuka itu. Tetapi tidak tergantung pada implementasi antarmuka. Akan saya akui bahwa penjelasan saya mungkin bisa menggunakan sedikit lebih banyak kecakapan. :)Isolasi.
Ide unit mengujinya untuk menguji unit kode sekecil mungkin . Anda melakukan ini dengan mengisolasinya dari semua kode produksi lainnya dalam pengujian.
Dengan membuat kelas palsu, satu-satunya kode produksi adalah kelas yang diuji.
Jika Anda membuat repositori palsu dengan benar dan pengujian gagal, Anda tahu bahwa masalahnya ada pada kode-dalam-tes. Ini memberi Anda manfaat diagnosis secara gratis.
Lihatlah kerangka kerja isolasi (seperti Moq seperti yang disarankan oleh @Allan) untuk dapat menghasilkan pemalsuan ini dengan cepat untuk mengatur kondisi pengujian dan menggunakannya untuk menegaskan.
sumber
Ada tiga alasan mengapa Anda mungkin ingin memberikan contoh tiruan untuk unit test:
sumber