如何使用RSpec的should_raise与任何exception?
我想要做这样的事情:
some_method.should_raise <any kind of exception, I don't care> 我应该怎么做?
 some_method.should_raise exception 
…不起作用。
 expect { some_method }.to raise_error 
RSpec 1语法:
 lambda { some_method }.should raise_error 
有关更多信息,请参阅文档 (适用于RSpec 1语法)和RSpec 2文档 。
使用expect来代替lambda:
  expect { some_method }.to raise_error 
这适用于rspec的更新版本,即rspec 2.0及更高版本。
查看更多的DOCO 。
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_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 ... 
 注意: raise_error是raise_error的别名。 
文档: https : //www.relishapp.com/rspec
RSpec 2:
- https://www.relishapp.com/rspec/rspec-expectations/v/2-13/docs/built-in-matchers/raise-error-matcher
RSpec 1:
语法最近改变了,现在是:
 expect { ... }.to raise_error(ErrorClass) 
 从rspec-expections 3.3版本开始,gem在没有参数的情况下提出了一个空的raise_error警告 
 expect { raise StandardError }.to raise_error # results in warning expect { raise StandardError }.to raise_error(StandardError) # fine 
这给了你一个暗示,你的代码可能会失败,并且出现与testing打算检查不同的错误。
警告:使用
raise_error匹配器而不提供具体的错误或消息有误报的风险,因为当Ruby引发NoMethodError,NameError或ArgumentError时,raise_error将匹配,甚至可能允许期望通过,甚至不执行您打算调用的方法。 而是考虑提供一个特定的错误类或消息。 这个消息可以通过设置来抑制:RSpec::Expectations.configuration.warn_about_potential_false_positives = false。