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

时间:2010-08-11 02:47:34

标签: ruby-on-rails assert activesupport raise

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

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

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

2 个答案:

答案 0 :(得分:97)

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

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

assert_raise(Exception) { whatever.merge }

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

lambda { whatever.merge }.should raise_error

如果您想检查引发的Exception

exception = assert_raises(Exception) { whatever.merge }
assert_equal( "message", exception.message )

答案 1 :(得分:14)

要确保在测试用例中没有引发(或成功处理)异常:

assert_nothing_raised RuntimeError do
  whatever.merge
end

要检查测试用例内是否出现错误:

assert_raise RuntimeError do
  whatever.merge
end

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