ฉันต้องการทำสิ่งนี้:
some_method.should_raise <any kind of exception, I don't care>
ฉันจะทำสิ่งนี้ได้อย่างไร
some_method.should_raise exception
... ไม่ทำงาน
ฉันต้องการทำสิ่งนี้:
some_method.should_raise <any kind of exception, I don't care>
ฉันจะทำสิ่งนี้ได้อย่างไร
some_method.should_raise exception
... ไม่ทำงาน
คำตอบ:
expect { some_method }.to raise_error
ไวยากรณ์ RSpec 1:
lambda { some_method }.should raise_error
ดูเอกสารประกอบ (สำหรับไวยากรณ์ RSpec 1) และเอกสารคู่มือRSpec 2เพิ่มเติม
expect { some_method }.to raise_error
expect { some_method }.to raise_error(SomeError)
expect { some_method }.to raise_error("oops")
expect { some_method }.to raise_error(/oops/)
expect { some_method }.to raise_error(SomeError, "oops")
expect { some_method }.to raise_error(SomeError, /oops/)
expect { some_method }.to raise_error(...){|e| expect(e.data).to eq "oops" }
# Rspec also offers to_not:
expect { some_method }.to_not raise_error
...
หมายเหตุ: raise_error
และraise_exception
สามารถใช้แทนกันได้
lambda { some_method }.should raise_error
lambda { some_method }.should raise_error(SomeError)
lambda { some_method }.should raise_error(SomeError, "oops")
lambda { some_method }.should raise_error(SomeError, /oops/)
lambda { some_method }.should raise_error(...){|e| e.data.should == "oops" }
# Rspec also offers should_not:
lambda { some_method }.should_not raise_error
...
หมายเหตุ: เป็นนามแฝงสำหรับraise_error
raise_exception
RSpec 2:
RSpec 1:
แทนที่จะใช้แลมบ์ดาคาดหวังว่าจะ:
expect { some_method }.to raise_error
สิ่งนี้ใช้ได้กับ rspec รุ่นใหม่ ๆ เช่น rspec 2.0 ขึ้นไป
ดูdocoมาก
expect
lambda
expect { visit welcome_path }.to raise_error
ไวยากรณ์มีการเปลี่ยนแปลงเร็ว ๆ นี้และตอนนี้มันเป็น:
expect { ... }.to raise_error(ErrorClass)
จากเวอร์ชัน 3.3 บนrspec-expections
gem จะเพิ่มคำเตือนสำหรับ empty ra_error โดยไม่มีพารามิเตอร์
expect { raise StandardError }.to raise_error # results in warning
expect { raise StandardError }.to raise_error(StandardError) # fine
สิ่งนี้จะให้คำแนะนำว่ารหัสของคุณอาจล้มเหลวพร้อมกับข้อผิดพลาดที่แตกต่างจากการทดสอบที่ต้องการตรวจสอบ
คำเตือน: การใช้
raise_error
การจับคู่โดยไม่ต้องให้ข้อผิดพลาดที่เฉพาะเจาะจงหรือข้อความความเสี่ยงบวกเท็จเนื่องจากraise_error
จะตรงกับเมื่อทับทิมยกNoMethodError
,NameError
หรือArgumentError
อาจช่วยให้ความคาดหวังที่จะผ่านโดยไม่ได้ดำเนินการวิธีการที่คุณประสงค์จะโทร ให้พิจารณาจัดเตรียมคลาสข้อผิดพลาดหรือข้อความแทน ข้อความนี้สามารถ supressedRSpec::Expectations.configuration.warn_about_potential_false_positives = false
โดยการตั้งค่า: