在MiniTest的assert_raises / must_raise中检查异常消息的预期语法是什么?


Answers:


150

您可以使用assert_raises断言或must_raise期望。

it "must raise" do
  assert_raises RuntimeError do 
    bar.do_it
  end
  ->     { bar.do_it }.must_raise RuntimeError
  lambda { bar.do_it }.must_raise RuntimeError
  proc   { bar.do_it }.must_raise RuntimeError
end

如果您需要测试错误对象上的某些内容,则可以从断言或期望中获取,如下所示:

describe "testing the error object" do
  it "as an assertion" do
    err = assert_raises RuntimeError { bar.do_it }
    assert_match /Foo/, err.message
  end

  it "as an exception" do
    err = ->{ bar.do_it }.must_raise RuntimeError
    err.message.must_match /Foo/
  end
end

酷,我明白了。但是,我仍然不知道如何对引发的错误消息进行断言。
kfitzpatrick

3
err =-> {bar.do_it} .must_raise RuntimeError语法对我不起作用,它不断引发以下异常。NoMethodError:nil:NilClass的未定义方法“ assert_raises”
thanikkal,2015年

2
@thanikkal确保您正在使用,Minitest::Spec而不是Minitest::Test。仅当使用时,Spec DSL(包括期望)才可用Minitest::Spec
爆炸

28

声明异常:

assert_raises FooError do
  bar.do_it
end

要声明异常消息:

根据API docassert_raises返回匹配的异常,因此您可以检查消息,属性等。

exception = assert_raises FooError do
  bar.do_it
end
assert_equal('Foo', exception.message)

7

Minitest尚未(尚未)为您提供检查实际异常消息的方法。但是您可以添加一个辅助方法来实现它,并扩展ActiveSupport::TestCase类以在rails测试套件中的任何地方使用,例如:test_helper.rb

class ActiveSupport::TestCase
  def assert_raises_with_message(exception, msg, &block)
    block.call
  rescue exception => e
    assert_match msg, e.message
  else
    raise "Expected to raise #{exception} w/ message #{msg}, none raised"
  end
end

并在测试中使用它,例如:

assert_raises_with_message RuntimeError, 'Foo' do
  code_that_raises_RuntimeError_with_Foo_message
end

2
不错,Minitest不支持检查错误消息,但是可以使用must_raise它来实现,因为它为您提供了错误的实例,因此您可以自己检查该消息。
bithavoc 2014年

1
这种解决方案对我来说感觉更好,但我以前从未使用must_raise过。
pumazi

我认为,如果未引发异常,则该解决方案不会失败。您只需检查引发的异常是正确的异常。但是,如果没有引发异常,则不会进行断言=>没有错误。
福田

好点@Foton我更改了答案以反映该期望。
开发人员

0

为了增加一些最新的发展,过去已经进行了一些讨论,以增加assert_raises_with_message最小测试的运气。

当前,有一个有希望的拉动请求合并等待合并。如果以及何时合并,我们将能够使用assert_raises_with_message而不必自己定义。

同时,有一个名为minitest-bonus-assertions的方便的小宝石,它精确地定义了该方法以及其他方法,因此您可以立即使用它。有关更多信息,请参阅文档

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.