किसी भी तरह के अपवाद के साथ RSpec के should_raise का उपयोग कैसे करें?


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_errorलिए एक उपनाम है raise_exception

प्रलेखन: https://www.relishapp.com/rspec

RSpec 2:

RSpec 1:


यह बहुत अच्छा जवाब था।
जिग्गी

raise_error (/ oops /) अपवाद संदेश में
प्रतिस्थापन की

1
यह इंगित करने के लिए धन्यवाद कि raise_error और raise_exception के लिए विनिमेय (y) हैं
Yo Ludke

85

लैम्ब्डा के बजाय, उम्मीद का उपयोग करें:

   expect { some_method }.to raise_error

यह rspec के हाल के संस्करणों के लिए लागू होता है, यानी rspec 2.0 और ऊपर।

अधिक के लिए डोको देखें ।


मैं Rspec 1 के लिए इसका उपयोग नहीं करता, लेकिन Rspec 2 के लिए यह ठीक उसी तरह काम करता है जैसे इसे करना चाहिए।
एरिक्राओ

6
दरअसल, ऊपर दिए गए डॉक्यूमेंटेशन लिंक के अनुसार, यह {some_method} .to up_error
Guilherme Garnier

न तो आपकी टिप्पणी और न ही वह पृष्ठ जो आपको यह बताने के लिए लिंक करता है कि क्यों expectबेहतर है या इससे भी बदतर है lambda
क्रैगन जेवियर सीटेकर

1
उम्मीद है कि rspec 2.0 और उच्चतर के लिए है। यह तर्क उस तर्क को लूटता है जिसके बारे में एक बेहतर है, क्योंकि लंबोदर सिंटैक्स किसी भी अधिक काम नहीं करता है
रोब

यह मेरे लिए capybara में काम नहीं करता है:expect { visit welcome_path }.to raise_error
nnyby

65

सिंटैक्स हाल ही में बदल गया है और अब यह है:

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

4

rspec-expectionsमणि पर संस्करण 3.3 से एक पैरामीटर के बिना रिक्त उठने_रोर के लिए चेतावनी देता है

expect { raise StandardError }.to raise_error # results in warning
expect { raise StandardError }.to raise_error(StandardError) # fine

इससे आपको संकेत मिलता है कि आपका कोड जांच के इरादे से अलग त्रुटि के साथ विफल हो सकता है।

चेतावनी: raise_errorएक विशिष्ट त्रुटि प्रदान करने के बिना मिलानकर्ता का उपयोग करना या संदेश गलत सकारात्मकता को जोखिम में डाल देता है, क्योंकि raise_errorजब मैच रूबी उठाएगा NoMethodError, NameErrorया ArgumentErrorसंभावित रूप से उस अपेक्षा को पारित करने की अनुमति देगा जो उस पद्धति को निष्पादित करने के बिना भी जिसे आप कॉल करना चाहते हैं। इसके बजाय एक विशिष्ट त्रुटि वर्ग या संदेश प्रदान करने पर विचार करें। यह संदेश सेटिंग द्वारा दबाया जा सकता है RSpec::Expectations.configuration.warn_about_potential_false_positives = false:।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.