代码之家  ›  专栏  ›  技术社区  ›  spilliton

Rails ActiveSupport:如何断言引发了错误?

  •  42
  • spilliton  · 技术社区  · 14 年前

    我想在我的一个模型上测试一个抛出特定错误的函数。函数如下所示:

    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
    

    2 回复  |  直到 14 年前
        1
  •  111
  •   Jon Schneider Stefan    6 年前

    所以单元测试并不是真正的activesupport。Ruby在标准libs中附带了一个典型的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 )
    
        2
  •  17
  •   shivam    6 年前

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

    assert_nothing_raised RuntimeError do
      whatever.merge
    end
    

    assert_raise RuntimeError do
      whatever.merge
    end
    

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