Apa tujuan Verifiable () di Moq?

125

Apa tujuan dari Verifiable()?

Jika saya memverifikasi Mockdan membiarkannya keluar, itu masih memverifikasi SetUp.

Sunting: Saya menggunakan VerifyAll()demikian alasan untuk semuanya diverifikasi. Setelah berubah menjadi Verify()hanya saya .Verifiable() SetUpyang diperiksa.

Castrohenge
sumber

Jawaban:

83

TAMBAHAN: Seperti yang dinyatakan oleh jawaban lain, tujuannya .Verifiableadalah untuk mendaftarkan Setupsatu set " Verify(...)panggilan yang ditangguhkan " yang kemudian dapat dipicu melalui mock.Verify().

Klarifikasi OP memperjelas bahwa ini adalah tujuannya dan satu-satunya masalah adalah mencari tahu mengapa itu tidak berhasil, tetapi seperti yang didorong oleh @Liam, jawabannya juga harus benar-benar menyentuh ini: - Kasus penggunaan utama sejauh yang saya bisa lihat adalah:

  • menjaga KERINGAN antara a mock.Setup()danmock.Verify
  • mengizinkan seseorang untuk memutuskan konfigurasi verifikasi dari Verifypanggilan sebenarnya itu sendiri (misalnya, Anda dapat mengaturnya di metode pembantu lain)

... dan kembali ke jawaban saya, yang secara singkat mengatakan "berhati-hatilah karena para profesional di atas biasanya dianggap kalah oleh pengaruh pencapaian tujuan tersebut terhadap keterbacaan dan pemeliharaan tes yang terlalu mengandalkan konstruksi seperti itu"

ASLI: Perhatikan bahwa jika memungkinkan, seseorang harus mengikuti tata letak AAA dan karenanya seseorang harus melakukan mock.Verify( expression )panggilan eksplisit setelah pekerjaan selesai, daripada mock.Setup( ... ).Verifiable()dipasangkan dengan a mock.Verify()atau dimock.VerifyAll() mana pun memungkinkan (kredit: @kzu ).

Ruben Bartelink
sumber
7
@EricSmith Melihat ke belakang, jangan berpikir saya mengatakannya dengan cukup kuat. Ada manfaat yang jauh lebih besar dari membagi pekerjaan Anda ke dalam bundling AAA daripada terlalu berkonsentrasi pada kesamaan antara fase Atur dan Tegaskan. 90% dari waktu, ada sesuatu yang bisa diperoleh dari nuansa bagaimana Anda mengekspresikan panggilan Verifikasi di akhir, jadi Anda harus meluangkan banyak waktu untuk mengoptimalkannya, bahkan jika dalam beberapa kasus tampak seperti duplikasi yang menyakitkan. Salah satu poin yang dibuat dengan sangat baik oleh manning.com/osherove adalah bahwa membuat pengujian yang masuk akal bagi seseorang yang terlibat sangat penting - jadi patuhi kesepakatan!
Ruben Bartelink
3
Saya biasanya bukan orang yang menentang butir kebijaksanaan yang diterima tetapi saya belum yakin akan manfaat AAA vs Verifyable()/ VerifyAll()dalam semua kasus. Pengujian unit saya saat ini memiliki banyak Setup(...)panggilan (> 30). Dapat mencocokkan masing-masing dengan Verify () yang setara untuk memenuhi konvensi, tetapi hal ini menyebabkan duplikasi kode dalam jumlah besar dan akan lebih sulit untuk dipertahankan dan dibaca saat jumlah pengujian unit bertambah. Saya kira apa yang sebenarnya saya tanyakan adalah dapatkah pengecualian dibuat jika ada banyak Penyiapan atau apakah menghindari Verifiable()aturan yang keras dan cepat?
Steve Chambers
5
@SteveChambers Elemen kunci AAA adalah bahwa ini bukan A * - harus ada satu Act dan satu Assert. Jadi, sementara Anda secara teknis benar dalam mengatakan bahwa itu adalah kode yang lebih sedikit untuk Anda, kebetulan mana dari Pengaturan Anda berlaku untuk yang (sub) Kisah dan (sub) Penegasan akan selalu menjadi ladang ranjau. Jadi tidak, ini tidak sulit dan cepat, tetapi saya akan mengatakan bahwa menyarankan bahwa itu bahkan mendekati 50:50 akan menjadi Saran yang Sangat Buruk. (Juga perhatikan bahwa Anda tidak perlu melakukan Setup untuk melakukan Verifikasi kecuali Anda mencoba untuk memperkenalkan perilaku tertentu selama Act- yang merupakan elemen lain dari tes yang jelas)
Ruben Bartelink
1
@Liam Dan itu adalah memang benar-benar baik bahwa Anda masih yakin ini merupakan alat yang tepat untuk pekerjaan Anda - titik nyata saya hanya bahwa hal itu disukai sebagai pendekatan umum untuk menulis tes dengan mengolok-olok - yaitu meskipun fakta bahwa itu rapi mencapai kekeringan antara a Setupdan a Verify, yang mungkin kehilangan kemenangan yang lebih tinggi yang dapat dicapai hanya dengan melonggarkan kendala KERING dengan cara yang disarankan oleh AAA dan kelompok strategi yang sangat menyiratkan
Ruben Bartelink
1
@Liam Terima kasih atas dorongannya; Saya memperbarui jawaban saya karena Anda benar pada poin yang Anda buat. Kembali pada hari ketika saya menjawab pertanyaan SO seperti ini, pandangan saya umumnya adalah secara ringkas menyatakan jawaban atomik dan kemudian membiarkan jawaban yang bersaing seperti yang lain mengisi peta. Hari-hari ini (jika saya masih meluangkan waktu untuk menjawab pertanyaan) kemungkinan besar saya akan mencoba memberikan jawaban yang lebih lengkap dari yang telah terjadi pada awalnya.
Ruben Bartelink
54

Ketika Verify()metode dipanggil di akhir pengujian, jika salah satu ekspektasi yang ditandai sebagai dapat diverifikasi belum dipanggil, maka pengecualiannya adalah thrown.

VerifyAll() tidak memeriksa ekspektasi yang dapat diverifikasi.

Suvesh Pratapa
sumber
maukah Anda menjelaskan lebih banyak tentang VerifyAll () tidak memeriksa ekspektasi yang dapat diverifikasi?
JW
@JW Artinya VerifyAll memverifikasi semua pengaturan tanpa mempertimbangkan apakah mereka telah ditandai sebagai ekspektasi yang dapat diverifikasi.
phoog