web-dev-qa-db-ja.com

MiniTestのassert_raises / must_raiseで例外メッセージをチェックするために期待される構文は何ですか?

MiniTestのassert_raises/must_raiseで例外メッセージをチェックするために期待される構文は何ですか?

次のようなアサーションを作成しようとしていますが、"Foo"は予期されるエラーメッセージです。

proc { bar.do_it }.must_raise RuntimeError.new("Foo")
81
kfitzpatrick

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
140
blowmage

例外をアサートするには:

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)
22
Jing Li

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
6
Developer

さらに最近の開発を追加するために、過去にミニテストにassert_raises_with_messageを追加することについて、多くの幸運なしに いくつかの議論 がありました。

現在、 有望なプルリクエスト がマージされるのを待っています。統合された場合、assert_raises_with_messageを自分で定義することなく使用できます。

その間、 minitest-bonus-assertions という名前のこの便利な小さな宝石があります。これは、他のいくつかと一緒にそのメソッドを正確に定義し、すぐに使用できるようにします。詳細については、 docs を参照してください。

0
Kostas Rousis