วิธีใช้ shouldpraise ของ RSpec ด้วยข้อยกเว้นใด ๆ


211

ฉันต้องการทำสิ่งนี้:

some_method.should_raise <any kind of exception, I don't care>

ฉันจะทำสิ่งนี้ได้อย่างไร

some_method.should_raise exception

... ไม่ทำงาน

คำตอบ:



88

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สามารถใช้แทนกันได้

RSpec 1

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_errorraise_exception

เอกสารประกอบ: https://www.relishapp.com/rspec

RSpec 2:

RSpec 1:


นั่นคือคำตอบที่ดี
Ziggy

ยก _error (/ oops /) เป็นวิธีที่ดีในการตรวจสอบสตริงย่อยในข้อความข้อยกเว้น
Serge Seletskyy

1
ขอบคุณสำหรับการชี้ให้เห็นว่า raunch_error และสำหรับ Raise_exception สามารถใช้แทนกันได้ (y)
Yo Ludke

85

แทนที่จะใช้แลมบ์ดาคาดหวังว่าจะ:

   expect { some_method }.to raise_error

สิ่งนี้ใช้ได้กับ rspec รุ่นใหม่ ๆ เช่น rspec 2.0 ขึ้นไป

ดูdocoมาก


ฉันจะไม่ใช้สิ่งนี้กับ Rspec 1 แต่สำหรับ Rspec 2 มันใช้งานได้ตามที่ควรจะเป็น
ericraio

6
ที่จริงแล้วตามลิงก์เอกสารด้านบนนี้ควรคาดว่า {some_method} .to raate_error
Guilherme Garnier

ทั้งความคิดเห็นของคุณหรือหน้าเว็บที่คุณเชื่อมโยงไปยังอธิบายว่าทำไมจะดีขึ้นหรือเลวร้ายยิ่งกว่าexpect lambda
Kragen Javier Sitaker

1
คาดหวังสำหรับ rspec 2.0 และสูงกว่า สิ่งนี้แสดงให้เห็นถึงการถกเถียงกันว่าเรื่องใดดีกว่ากันเนื่องจากไวยากรณ์แลมบ์ดาไม่ทำงานอีกต่อไป
Rob

สิ่งนี้ไม่ได้ผลสำหรับฉันใน capybara:expect { visit welcome_path }.to raise_error
nnyby

65

ไวยากรณ์มีการเปลี่ยนแปลงเร็ว ๆ นี้และตอนนี้มันเป็น:

expect { ... }.to raise_error(ErrorClass)

4

จากเวอร์ชัน 3.3 บนrspec-expectionsgem จะเพิ่มคำเตือนสำหรับ 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อาจช่วยให้ความคาดหวังที่จะผ่านโดยไม่ได้ดำเนินการวิธีการที่คุณประสงค์จะโทร ให้พิจารณาจัดเตรียมคลาสข้อผิดพลาดหรือข้อความแทน ข้อความนี้สามารถ supressed RSpec::Expectations.configuration.warn_about_potential_false_positives = falseโดยการตั้งค่า:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.