Apa perbedaan antara ejekan dan bertopik pada Rhino Mock?

149

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.

Rismo
sumber

Jawaban:

148

Sesuai ini

... Sederhananya ada perbedaan antara objek Mock dan Stub dan RhinoMock mengakui bahwa memungkinkan kita untuk menulis tes yang lebih baik menyatakan tujuan mereka.

Objek tiruan digunakan untuk mendefinisikan harapan yaitu: Dalam skenario ini saya mengharapkan metode A () dipanggil dengan parameter ini dan itu. Mock merekam dan memverifikasi harapan tersebut.

Rintisan bertopik, di sisi lain memiliki tujuan yang berbeda: mereka tidak mencatat atau memverifikasi harapan, tetapi lebih memungkinkan kita untuk "mengganti" perilaku, keadaan objek "palsu" untuk memanfaatkan skenario pengujian ...

rbrayb
sumber
Saya menemukan pos lain yang bermanfaat yang menggemakan pesan yang sama dengan jawaban yang diterima untuk pertanyaan ini - martinfowler.com/articles/mocksArentStubs.html .
singh1469
20

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.

superluminary
sumber
7

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.

Hassan Boutougha
sumber
Anda sepertinya mengatakan bahwa tes Anda harus "memeriksa" hasil tiruan. Jika itu yang Anda katakan, Anda salah. Mock tidak seharusnya diuji; itu ada di sana sehingga Anda dapat menguji kode lain . Atau apakah kalimat terakhir Anda berarti sesuatu yang lain?
Andrew Barber
1
Hai Andrew, seperti yang saya tulis pada Mock, Anda memperbaiki hasil tes sehingga Anda tidak akan mengujinya. Jika tidak, saya telah menulis bahwa Mock memungkinkan Anda untuk memeriksa interaksi (perilaku harapan ... ;-)
Hassan Boutougha
1
Oke, itu lebih masuk akal. Terimakasih atas klarifikasinya!
Andrew Barber
> tidak membuat pernyataan tentang rintisan. Mengapa dalam banyak pernyataan perpustakaan masih ada metode alias should have been called withuntuk menegaskan stubparameter.
Hellboy
5

Dalam hal kerangka kerja Moq - metode penyetelan adalah STUB sedangkan metode Verifikasi adalah Mock

berbasis kode
sumber
0

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.

Sean
sumber