วิธีพูด“ should_receive” ให้มากขึ้นหลาย ๆ ครั้งใน RSpec


112

ฉันมีสิ่งนี้ในการทดสอบของฉัน

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

แต่เมื่อวัตถุได้รับการเรียกใช้เมธอดนั้นสองครั้งฉันต้องทำ

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

มีวิธีใดบ้างที่จะพูดเช่น

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

คำตอบ:


214

สิ่งนี้ล้าสมัย โปรดตรวจสอบคำตอบของ Uriด้านล่าง

เป็นเวลา 2 ครั้ง:

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

สำหรับ n ครั้ง:

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

อย่างน้อย n ครั้ง:

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

รายละเอียดเพิ่มเติมที่https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-countsภายใต้การนับจำนวน

หวังว่ามันจะช่วย =)


3
ดูเหมือนว่าอาจจะใช้ไม่ได้กับany_instance?
Jared Beck

@YoLudke ฉันไม่รู้
Jared Beck

2
ควรใช้ไวยากรณ์ใหม่ที่กล่าวถึงในคำตอบของยูริ
theblang

61

expectไวยากรณ์ใหม่ของ rspec จะมีลักษณะดังนี้:

เป็นเวลา 2 ครั้ง:

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

สำหรับ n ครั้ง:

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

อย่างน้อย n ครั้ง:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)

1
have_receivedไวยากรณ์ยังทำงาน expect(Project).to have_received(:find).exactly(n).timesฯลฯ
David Tuite

0

@JaredBeck ชี้ให้ดู วิธีแก้ปัญหาไม่ได้ผลสำหรับฉันเมื่อany_instanceโทร

สำหรับอินสแตนซ์ใด ๆ ฉันลงเอยด้วยการใช้ต้นขั้วแทน should_receive

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

สิ่งนี้จะใช้ได้ผลกับข้อใด หลายครั้งแม้ว่า



0

should_receiveในทางตรงกันข้ามany_instanceคาดว่าชั้นเรียนจะได้รับข้อความตามจำนวนครั้งที่ระบุ

any_instance ในทางกลับกันโดยทั่วไปจะใช้สำหรับการขีดฆ่าวิธีการ

ดังนั้นกรณีแรกจึงเป็นความคาดหวังที่เราต้องการทดสอบในขณะที่กรณีที่สองกำลังผ่านเมธอดไปยังบรรทัดถัดไปเพื่อที่เราจะได้ไปต่อ


1
Drenmi ขอขอบคุณเวลาที่คุณเพิ่มเครื่องหมายจุลภาคลงในโพสต์ที่ฉันได้เพิ่มไว้เมื่อเกือบหนึ่งปีที่แล้ว ... ดูเหมือนว่าจะไม่มีการเปลี่ยนแปลงใด ๆ ในด้านเทคนิคของคำตอบ ... ทำไมคุณถึงลงคะแนน ฉันสำหรับสิ่งนี้ ... ?
amnsan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.