如何使用RSpec的should_raise与任何类型的异常?

时间:2009-11-12 14:53:22

标签: ruby-on-rails ruby exception-handling rspec

我想做这样的事情:

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

我该怎么做?

some_method.should_raise exception

......不起作用。

5 个答案:

答案 0 :(得分:379)

expect { some_method }.to raise_error

RSpec 1语法:

lambda { some_method }.should raise_error

请参阅the documentation(针对RSpec 1语法)和RSpec 2 documentation了解更多信息。

答案 1 :(得分:86)

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_errorraise_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:

答案 2 :(得分:84)

而不是lambda,请使用expect:

   expect { some_method }.to raise_error

这适用于更新版本的rspec,即rspec 2.0及更高版本。

有关详情,请参阅doco

答案 3 :(得分:65)

语法最近改变了,现在是:

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

答案 4 :(得分:4)

rspec-expections的版本3.3开始,gem会针对没有参数的空白raise_error发出警告

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

这会向您提示您的代码可能会因为与要检查的测试不同的错误而失败。

  

警告:使用raise_error匹配器而不提供特定错误或消息可能会产生误报,因为raise_error将匹配Ruby引发NoMethodErrorNameError或{{{ 1}},可能允许期望在没有执行您打算调用的方法的情况下通过。而是考虑提供特定的错误类或消息。可以通过设置ArgumentError

来抑制此消息