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_raises
とassert_match
を両方使う必要はありません。例外とそのメッセージを確認するには、assert_raises
だけでよいのです。
概要
元サイトの許諾を得て翻訳・公開いたします。
なお、
assert_raises
にはassert_raise
というエイリアスもあります。