Saya belum cukup bermain dengan ini dan biasanya menggunakan ejekan, tapi saya ingin tahu apa perbedaan antara keduanya dan kapan harus menggunakan satu atau yang lain pada Rhino Mocks.
Memperbarui:
Saya juga menemukan jawaban untuk pertanyaan saya dalam kata-kata Ayende :
Perbedaan antara bertopik dan mengolok-olok
Anda bisa mendapatkan definisi sebenarnya dari istilah-istilah ini dalam artikel ini: Mengolok-olok Bukan bertopik . Saya ingin fokus pada perbedaan dari sudut pandang Badak Mocks.
Mock adalah objek yang bisa kita atur harapannya, dan yang akan memverifikasi bahwa tindakan yang diharapkan memang terjadi. Rintisan adalah objek yang Anda gunakan untuk lulus ke kode yang diuji. Anda dapat mengatur harapan di atasnya, sehingga akan bertindak dengan cara tertentu, tetapi harapan itu tidak akan pernah diverifikasi. Properti rintisan akan secara otomatis berperilaku seperti properti normal, dan Anda tidak dapat menetapkan harapan padanya.
Jika Anda ingin memverifikasi perilaku kode yang diuji, Anda akan menggunakan tiruan dengan harapan yang sesuai, dan memverifikasi itu. Jika Anda hanya ingin melewatkan nilai yang mungkin perlu bertindak dengan cara tertentu, tetapi bukan fokus dari tes ini, Anda akan menggunakan sebuah rintisan.
PENTING: rintisan tidak akan pernah menyebabkan tes gagal.
sumber
Jawaban:
Sesuai ini
sumber
Secara umum, Unit menguji fungsi dan metode panggilan, dan kemudian memeriksa untuk melihat apakah perilaku yang diharapkan terjadi. Fungsi dan metode ini mungkin memerlukan parameter. Kami menggunakan bertopik dan mengejek untuk memenuhi parameter ini. Terkadang kita juga bisa mengejek objek global.
Rintisan bertopik
Stub adalah objek palsu kecil yang dapat digunakan pengujian Anda sebagai parameter untuk membuat panggilan fungsi berfungsi. Ini memungkinkan kami memverifikasi perilaku fungsi yang diuji. Itu tidak membiarkan kami memverifikasi efek samping, karena rintisan tidak memiliki implementasi.
Mengejek
Mock adalah sebuah rintisan dengan implementasi. Jika fungsi kami yang diuji berinteraksi dengan objek tiruan kami, kami dapat memverifikasi bahwa tiruan itu telah berinteraksi dengan seperti yang kami harapkan.
Misalnya, kami memiliki objek Pengguna tiruan, dan kami ingin memverifikasi bahwa metode session.login kami berfungsi, kami mungkin ingin memeriksa apakah user.lastLoggedIn telah disetel. Kita bisa membuat Pengguna tiruan yang mengimplementasikan metode ini. Ketika kita memanggil session.login, kita dapat menyatakan bahwa user.lastLoggedIn memiliki kondisi yang kita harapkan.
Untuk menyimpulkan
Mock adalah sebuah rintisan dengan implementasi, yang memungkinkan kita menguji efek samping.
Apakah perbedaan ini masih penting?
Agak seperti perbedaan antara perumpamaan dan kiasan, perbedaan antara bertopik dan mengejek adalah halus dan historis, dan mungkin lebih berkaitan dengan komunitas dan filosofi yang berbeda di dunia pengujian daripada perbedaan teknis utama.
Mereka mewakili pendekatan yang sedikit berbeda untuk pengujian. Mock dapat ditulis seperti rintisan. Sebuah rintisan biasanya dapat diperluas menjadi tiruan.
Yang mana yang harus Anda gunakan?
Anda mungkin menemukan bahwa Anda mulai membuat bertopik, kemudian Anda mungkin menemukan bahwa Anda perlu membuat penuh pada tiruan untuk beberapa objek Anda. Anda mungkin ingin mengejek segalanya saat Anda pergi, atau Anda mungkin hanya ingin mengejek di mana saja diperlukan.
sumber
Perbedaan antara Mock dan rintisan: dengan rintisan, Anda memperbaiki input dari tes unit Anda: sehingga tes unit Anda tidak membuat pernyataan tentang rintisan dan rintisan dengan menulis ulang implementasi beberapa metode memperbaiki perilaku objek palsu. dengan Mock, Anda memperbaiki ouput dari pengujian unit Anda: jadi pengujian unit Anda membuat harapan pada objek Mocking Anda dengan memeriksa interaksi internal pada objek mock Anda.
sumber
should have been called with
untuk menegaskanstub
parameter.Dalam hal kerangka kerja Moq - metode penyetelan adalah STUB sedangkan metode Verifikasi adalah Mock
sumber
Satu hal yang saya perhatikan juga adalah ketika saya menggunakan MockRepository.GenerateMock, saya harus secara eksplisit menetapkan harapan pada panggilan metode tertentu untuk mencegat panggilan itu. Dengan bertopik, itu tampaknya secara otomatis mencegat metode apa pun asalkan virtual.
sumber