Rails 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

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

spilliton asked 2020-02-13T09:13:19Z
2个解决方案
101 votes

因此,单元测试并不是在activesupport中。 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 )
Matt Briggs answered 2020-02-13T09:13:51Z
16 votes

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

assert_nothing_raised RuntimeError do
  whatever.merge
end

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

assert_raise RuntimeError do
  whatever.merge
end

请注意,whatever.merge是引发错误的代码(或不引起错误,具体取决于断言类型)。

shivam answered 2020-02-13T09:14:20Z
translate from https://stackoverflow.com:/questions/3454925/rails-activesupport-how-to-assert-that-an-error-is-raised