Rails ActiveSupport:如何声明引发错误?

spi*_*ton 49 assert ruby-on-rails raise activesupport

我想在我的一个模型上测试一个抛出特定错误的函数.该函数看起来像这样:

def merge(release_to_delete)
  raise "Can't merge a release with itself!" if( self.id == release_to_delete.id )
  raise "Can only merge releases by the same artist" if( self.artist != release_to_delete.artist   )
  #actual merge code here
end
Run Code Online (Sandbox Code Playgroud)

现在我想做一个断言,当我用一个导致每个异常的参数调用这个函数时,实际上会抛出异常.我正在查看ActiveSupport文档,但我没有找到任何有希望的东西.有任何想法吗?

Mat*_*ggs 102

所以单元测试并不是真正的主动支持.Ruby在标准库中有一个典型的xunit框架(ruby 1.8.x中的Test :: Unit,ruby 1.9中的MiniTest),而activesupport中的东西只是添加了一些东西.

如果您使用的是Test :: Unit/MiniTest

assert_raise(Exception) { whatever.merge }
Run Code Online (Sandbox Code Playgroud)

如果你正在使用rspec(遗憾的是记录不清,但更受欢迎)

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

如果你想检查凸起Exception:

exception = assert_raises(Exception) { whatever.merge }
assert_equal( "message", exception.message )
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我不得不使用"RuntimeError"而不是异常,如下所示:assert_raise(RuntimeError){artist1.merge(artist1)}本指南非常有用:http://guides.rubyonrails.org/testing.html (8认同)

shi*_*vam 16

为确保不会引发(或成功处理)异常,请在测试用例中进行:

assert_nothing_raised RuntimeError do
  whatever.merge
end
Run Code Online (Sandbox Code Playgroud)

要检查是否引发了错误,请在测试用例中进行:

assert_raise RuntimeError do
  whatever.merge
end
Run Code Online (Sandbox Code Playgroud)

只是抬头,whatever.merge是引发错误的代码(或者不是,取决于断言类型).