How to use RSpec's should_raise with any kind of exception?

Ruby on-RailsRubyException HandlingRspec

Ruby on-Rails Problem Overview


I'd like to do something like this:

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

How should I do this?

some_method.should_raise exception

... doesn't work.

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

expect { some_method }.to raise_error

RSpec 1 Syntax:

lambda { some_method }.should raise_error

See the documentation (for RSpec 1 syntax) and RSpec 2 documentation for more.

Solution 2 - Ruby on-Rails

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
...

Note: raise_error and raise_exception are interchangeable.

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
...

Note: raise_error is an alias for raise_exception.

Documentation: https://www.relishapp.com/rspec

RSpec 2:

RSpec 1:

Solution 3 - Ruby on-Rails

Instead of lambda, use expect to:

   expect { some_method }.to raise_error

This is applies for more recent versions of rspec, i.e. rspec 2.0 and up.

See the http://relishapp.com/rspec/rspec-expectations/v/2-0/dir/matchers/expect-error">doco</a> for more.

Solution 4 - Ruby on-Rails

The syntax changed recently and now it is:

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

Solution 5 - Ruby on-Rails

From version 3.3 on rspec-expections gem raises a warning for a blank raise_error without a parameter

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

This gives you a hint that your code may fail with a different error than the test intended to check.

> WARNING: Using the raise_error matcher without providing a specific error or message risks false positives, since raise_error will match when Ruby raises a NoMethodError, NameError or ArgumentError, potentially allowing the expectation to pass without even executing the method you are intending to call. Instead consider providing a specific error class or message. This message can be supressed by setting: RSpec::Expectations.configuration.warn_about_potential_false_positives = false.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmarcggView Question on Stackoverflow
Solution 1 - Ruby on-RailsAvdiView Answer on Stackoverflow
Solution 2 - Ruby on-RailsjoelparkerhendersonView Answer on Stackoverflow
Solution 3 - Ruby on-RailsraccView Answer on Stackoverflow
Solution 4 - Ruby on-RailsayckosterView Answer on Stackoverflow
Solution 5 - Ruby on-RailsBruno E.View Answer on Stackoverflow