57

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

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 文档,但没有发现任何有希望的东西。有任何想法吗?

4

2 回答 2

120

所以单元测试并不是真正的积极支持。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 )
于 2010-08-11T02:54:44.983 回答
17

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

assert_nothing_raised RuntimeError do
  whatever.merge
end

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

assert_raise RuntimeError do
  whatever.merge
end

只是提醒一下,whatever.merge是引发错误的代码(或不引发错误,取决于断言类型)。

于 2013-12-04T05:32:14.397 回答