【发布时间】:2010-12-15 22:00:28
【问题描述】:
我想做这样的事情:
some_method.should_raise <any kind of exception, I don't care>
我应该怎么做?
some_method.should_raise exception
...不起作用。
【问题讨论】:
标签: ruby-on-rails ruby exception-handling rspec
我想做这样的事情:
some_method.should_raise <any kind of exception, I don't care>
我应该怎么做?
some_method.should_raise exception
...不起作用。
【问题讨论】:
标签: ruby-on-rails ruby exception-handling rspec
从 3.3 版开始,rspec-expections gem 针对没有参数的空白 raise_error 引发警告
expect { raise StandardError }.to raise_error # results in warning
expect { raise StandardError }.to raise_error(StandardError) # fine
这会提示您的代码可能会因与要检查的测试不同的错误而失败。
警告:在不提供特定错误或消息的情况下使用
raise_error匹配器可能会导致误报,因为当 Ruby 引发NoMethodError、NameError或ArgumentError时,raise_error将匹配,这可能会导致期望通过甚至不执行您打算调用的方法。而是考虑提供特定的错误类别或消息。可以通过设置来抑制此消息:RSpec::Expectations.configuration.warn_about_potential_false_positives = false。
【讨论】:
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 可以互换。
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 的别名。
RSpec 2:
RSpec 1:
【讨论】:
expect { some_method }.to raise_error
RSpec 1 语法:
lambda { some_method }.should raise_error
请参阅the documentation(RSpec 1 语法)和RSpec 2 documentation 了解更多信息。
【讨论】:
用expect代替lambda:
expect { some_method }.to raise_error
这适用于 rspec 的更新版本,即 rspec 2.0 及更高版本。
请参阅doco 了解更多信息。
【讨论】:
expect 比lambda 更好或更差。
expect { visit welcome_path }.to raise_error
语法最近发生了变化,现在是:
expect { ... }.to raise_error(ErrorClass)
【讨论】: