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


86

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

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

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

回答:


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 2013年

3
err =-> {bar.do_it} .must_raise RuntimeError構文が機能しませんでした。次の例外が発生し続けましたが、NoMethodError:nil:NilClassの未定義のメソッド「assert_raises」
thanikkal

2
@thanikkalを使用Minitest::Specしていて、使用していないことを確認してくださいMinitest::Test。期待を含むSpecDSLは、を使用している場合にのみ使用できますMinitest::Spec
ブローメイジ2016年

28

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

assert_raises FooError do
  bar.do_it
end

例外メッセージをアサートするには:

APIドキュメントに従って、assert_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 2015

例外が発生しなければ、このソリューションは失敗しないと思います。発生した例外が正しいことを確認するだけです。ただし、例外が発生しない場合、アサーションは実行されません=>エラーはありません。
Foton 2016年

良い点@Fotonその期待を反映するように答えを変更しました。
開発者

0

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

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

その間、minitest-bonus-assertionsという名前のこの便利な小さな宝石があります。これは、他のいくつかの方法とともに、その方法を正確に定義しているため、箱から出してすぐに使用できます。詳細については、ドキュメントを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.