rspec 3 - ทำลายเมธอดคลาส


100

ฉันกำลังอัปเกรดจาก rspec 2.99 เป็น rspec 3.0.3 และได้แปลงวิธีการใช้อินสแตนซ์allow_any_instance_ofแล้ว แต่ยังไม่ได้หาวิธีที่จะทำให้เมธอดคลาสแตก ฉันมีรหัสดังนี้:

module MyMod
  class Utils
    def self.find_x(myarg)
      # Stuff
    end
  end
end

และการทดสอบ rspec 2 ของฉันทำสิ่งนี้:

MyMod::Utils.stub(:find_x).and_return({something: 'testing'})

Rspec 3 คืออะไรในการทำสิ่งนี้?

คำตอบ:


176

คุณควรทำ

allow(MyMod::Utils).to receive(:find_x).and_return({something: 'testing'})

ตรวจสอบ doco สมบูรณ์วิธี


ฉันกำลังพยายามใช้สิ่งนี้ แต่เมื่อฉันเขียนล้อเลียนนั้นแล้วเขียนexpect(Class.foo).to eq(bar)ฉันได้รับ "จำนวนข้อผิดพลาดของอาร์กิวเมนต์ผิด" เพราะfooโดยปกติเมธอดต้องการ 2 อาร์กิวเมนต์ .... แต่ฉันแค่อยากให้มันส่งคืนสิ่งที่ฉันใส่ไว้ในต้นขั้ว
sixty4bit

FWIW แบบฟอร์มนี้จะทำให้ล่ามทับทิมของฉันเสียหาย อย่างไรก็ตามไม่จำเป็นต้องใช้ and_return อย่างเคร่งครัดและสามารถปิดทิ้งไว้ได้ (ล่ามทับทิมของฉันก็ไม่ผิดพลาด)
Ray Fix

2
@ sixty4bit มีเหตุผลอะไรที่คุณไม่สามารถเรียกมันว่ามีข้อโต้แย้งได้?
David Moles

4
@ sixty4bitexpect(Class.foo).to receive(bar).with(arg1, arg2).and_return({..object})
zhisme
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.