如何使用RSpec的should_raise进行任何形式的异常处理?


211

我想做这样的事情:

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

我应该怎么做?

some_method.should_raise exception

...不起作用。

Answers:



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_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_error是的别名raise_exception

说明文件:https : //www.relishapp.com/rspec

RSpec 2:

RSpec 1:


那是一个很好的答案。
Ziggy

raise_error(/ oops /)是一种检查异常消息
中子

1
感谢您指出raise_error和raise_exception是可以互换的(y)
Yo Ludke

85

代替lambda,使用期望:

   expect { some_method }.to raise_error

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

有关更多信息,请参阅doco


我不会将其用于Rspec 1,但对于Rspec 2,它会按预期工作。
ericraio 2012年

6
实际上,根据上面的文档链接,应该可以预期{some_method} .toraise_error
Guilherme Garnier

您的评论和您链接到的页面都没有解释为什么expect比更好或更差lambda
Kragen Javier Sitaker

1
期望适用于rspec 2.0及更高版本。这引发了关于哪个更好的争论,因为lambda语法不再起作用了
Rob

这在水豚中对我不起作用:expect { visit welcome_path }.to raise_error
nnyby

65

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

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

4

rspec-expectionsgem的3.3版开始,发出警告,提示没有参数的空白raise_error

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

这给您一个暗示,您的代码可能会因与要检查的测试不同的错误而失败。

警告:使用raise_error匹配,而不提供具体的错误或信息风险误报,因为raise_error当红宝石提出了一个匹配NoMethodErrorNameError或者ArgumentError,可能允许期望通过不执行,即使你打算调用的方法。而是考虑提供特定的错误类别或消息。此消息可以通过设置来supressed: RSpec::Expectations.configuration.warn_about_potential_false_positives = false

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.