Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7.1: assert_raisesで例外とメッセージをまとめてマッチ可能になった(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

なお、assert_raisesにはassert_raiseというエイリアスもあります。

Rails 7.1: assert_raisesで例外とメッセージをまとめてマッチ可能になった(翻訳)

RailsでminitestsやRSpecのテストを書くとき、多くの人はアプリケーションがエラーとそのメッセージを報告しているかどうか、または自分自身で追加したカスタムエラーとそのメッセージが一致するかどうかを確認したい場合があるでしょう。

同じものをチェックするには、提供されたコードで発生した例外をいったん保存してからassert_matchで確認する必要があるため、テストコードが増える可能性があります。

新しいテストファイルを作成して、自分たちで動作を確認しましょう。touch test/models/example_test.rbと入力して、次のコードをファイルに追加し、rails test test/models/example_test.rbを実行します。

🔗 改修前

class ExampleTest < ActiveSupport::TestCase
  def test_exception
    error = assert_raises(NoMethodError) do
      Date.now
    end
    assert_match(/undefined method `now' for Date:Class/i, error.message)
  end
end

🔗 改修後

767ecc4#46611)の変更によって、例外を変数に保存せずに、上と同じことを以下のようにスッキリした方法で書けるようになりました。

class ExampleTest < ActiveSupport::TestCase
  def test_exception
    assert_raises(NoMethodError, match: /undefined method `now' for Date:Class/i) do
      Date.now
    end
  end
end

🔗 まとめ

Rails 7.1で行われたこの変更では、同じチェックを行うためにassert_raisesassert_matchを両方使う必要はありません。例外とそのメッセージを確認するには、assert_raisesだけでよいのです。

関連記事

Ruby: テストを不安定にする5つの残念な書き方(翻訳)

Rails 7 API: ActiveRecord::FixtureSet(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。