Bagaimana cara mengatakan "should_receive" lebih banyak di RSpec

112

Saya memiliki ini dalam pengujian saya

Project.should_receive(:find).with(@project).and_return(@project)

tetapi ketika objek menerima panggilan metode itu dua kali, saya harus melakukannya

Project.should_receive(:find).with(@project).and_return(@project)
Project.should_receive(:find).with(@project).and_return(@project)

Apakah ada cara untuk mengatakan sesuatu seperti

Project.should_receive(:find).with(@project).and_return(@project).times(2)
Jakub Arnold
sumber

Jawaban:

214

Ini sudah ketinggalan zaman. Silakan periksa jawaban Uri di bawah ini

untuk 2 kali:

Project.should_receive(:find).twice.with(@project).and_return(@project)

tepat n kali:

Project.should_receive(:find).exactly(n).times.with(@project).and_return(@project)

setidaknya untuk n kali:

Project.should_receive(:msg).at_least(n).times.with(@project).and_return(@project)

detail lebih lanjut di https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts di bagian Terima Hitungan

Semoga membantu =)

Staelen
sumber
3
Sepertinya mungkin ini tidak berhasil any_instance?
Jared Beck
@YoLudke Saya tidak tahu
Jared Beck
2
Harus menggunakan sintaks baru yang disebutkan dalam jawaban Uri .
theblang
61

expectSintaks baru rspec akan terlihat seperti ini:

untuk 2 kali:

expect(Project).to receive(:find).twice.with(@project).and_return(@project)

tepat n kali:

expect(Project).to receive(:find).exactly(n).times.with(@project).and_return(@project)

setidaknya untuk n kali:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)
Uri Agassi
sumber
1
The have_receivedsintaks juga bekerja. expect(Project).to have_received(:find).exactly(n).timesdll.
David Tuite
0

@Jared menunjukkan. Solusinya tidak berhasil untuk saya saat any_instancemenelepon.

Untuk setiap contoh saya akhirnya menggunakan rintisan daripada should_receive.

Project.any_instance.stub(:some_method).and_return("value")

Ini akan berhasil untuk semua no. kali sekalipun.

Prasanna
sumber
0

should_receive, sebagai lawan any_instance, mengharapkan bahwa kelas menerima pesan beberapa kali.

any_instance di sisi lain umumnya digunakan untuk mematikan suatu metode.

Jadi kasus pertama adalah ekspektasi yang ingin kami uji, sedangkan kasus kedua adalah melewati metode ke baris berikutnya sehingga kami dapat melanjutkan.

amnsan
sumber
1
Drenmi Saya menghargai waktu yang Anda luangkan untuk menambahkan beberapa koma ke kiriman yang telah saya tambahkan hampir setahun yang lalu ... Sepertinya tidak ada perubahan pada aspek teknis dari jawaban ... Mengapa Anda tidak memilih saya untuk ini ...?
amnsan