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

mar*_*cgg 211 ruby rspec exception-handling ruby-on-rails

我想做这样的事情:

some_method.should_raise <any kind of exception, I don't care>
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

some_method.should_raise exception
Run Code Online (Sandbox Code Playgroud)

......不起作用.

Avd*_*vdi 380

expect { some_method }.to raise_error
Run Code Online (Sandbox Code Playgroud)

RSpec 1语法:

lambda { some_method }.should raise_error
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅文档(有关RSpec 1语法)和RSpec 2文档.

  • 啊..我刚注意到花括号! (5认同)

joe*_*son 87

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
...
Run Code Online (Sandbox Code Playgroud)

注意: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
...
Run Code Online (Sandbox Code Playgroud)

注意:raise_error是别名raise_exception.

文档:https://www.relishapp.com/rspec

RSpec 2:

RSpec 1:


rac*_*acc 84

而不是lambda,使用期望:

   expect { some_method }.to raise_error
Run Code Online (Sandbox Code Playgroud)

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

请参阅doco了解更多信息.

  • 实际上,根据上面的文档链接,这应该是**期望{some_method} .to raise_error** (6认同)

ayc*_*ter 65

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

expect { ... }.to raise_error(ErrorClass)
Run Code Online (Sandbox Code Playgroud)


Bru*_* E. 6

从版本 3.3 开始,rspec-expectionsgem 会针对不带参数的空白 raise_error 发出警告

expect { raise StandardError }.to raise_error # results in warning
expect { raise StandardError }.to raise_error(StandardError) # fine
Run Code Online (Sandbox Code Playgroud)

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

警告:raise_error在不提供特定错误或消息的情况下使用匹配器可能会导致误报,因为raise_error当 Ruby 引发NoMethodError,NameError或 时将进行匹配ArgumentError,甚至可能允许期望通过,甚至不执行您打算调用的方法。相反,请考虑提供特定的错误类别或消息。可以通过设置来抑制此消息:RSpec::Expectations.configuration.warn_about_potential_false_positives = false