【问题标题】:Rails ActiveSupport: How to assert that an error is raised?Rails ActiveSupport:如何断言引发了错误?
【发布时间】:2011-03-28 03:55:25
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails assert activesupport raise


    【解决方案1】:

    所以单元测试并没有真正得到积极的支持。 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 )
    

    【讨论】:

    • 谢谢!我不得不使用“RuntimeError”而不是异常,例如:assert_raise(RuntimeError){ artist1.merge(artist1)} 本指南非常有帮助:guides.rubyonrails.org/testing.html
    • @spiilliton:那是因为 Ruby 解释器将上面的代码视为assert_raise(Exception() { whatever.merge }),即它寻找一个名为Exception 的方法,该方法使用给定的块调用。添加括号 解决了这种歧义。 (已经确定了答案)
    • 在 rspec 3 中,使用 expect { whatever.merge }.to raise_error (relishapp.com/rspec/rspec-expectations/v/3-1/docs/…)
    【解决方案2】:

    为了确保在您的测试用例中不会引发(或成功处理)异常:

    assert_nothing_raised RuntimeError do
      whatever.merge
    end
    

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

    assert_raise RuntimeError do
      whatever.merge
    end
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-20
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2010-10-11
      • 2019-04-15
      • 1970-01-01
      相关资源
      最近更新 更多