`run_order` メソッド定義のガード条件を正しい対象クラスに修正
ActiveSupport::TestCase における run_order メソッド定義のガード条件が、Minitest モジュールから正しい対象である Minitest::Runnable クラスへ修正されました。
背景
この修正は、run_order メソッドの存在確認に誤ったレシーバーが使われていた点を解消します。コメントに「MT6 API change」と記されているとおり、このガード条件はMinitest 6で導入された run_order APIへの対応として書かれたものです。しかし run_order が実際に定義されているのは Minitest モジュールではなく Minitest::Runnable クラスであるため、Minitest.respond_to? による確認は意図した動作を保証できていませんでした。
技術的な変更
activesupport/lib/active_support/test_case.rb のガード条件1行が修正されました。
変更前:
if Minitest.respond_to? :run_order # MT6 API change
def run_order # :nodoc:
test_order
end
end
変更後:
if Minitest::Runnable.respond_to? :run_order # MT6 API change
def run_order # :nodoc:
test_order
end
end
respond_to? のレシーバーを Minitest(モジュール)から Minitest::Runnable(クラス)に変更しています。run_order はテスト実行の順序制御を担うクラスメソッドであり、Minitest::Runnable に定義されるものです。Minitest モジュール自体への問い合わせでは常に false を返す可能性があり、ガードが正しく機能しないまま残っていました。
設計判断
respond_to? によるバージョン互換ガードという既存の方針自体は維持されています。
メソッドの有無でAPIの存在を確認するダックタイピング的なアプローチは、MinitestのバージョンごとのAPI差異を吸収する上で有効な手段です。今回の変更は方針を変えるものではなく、問い合わせ先を実際にメソッドが定義されているオブジェクトへ正確に向けるという修正です。Minitest モジュールと Minitest::Runnable クラスは別オブジェクトであり、クラスメソッドの存在確認には正しいレシーバーを指定する必要があります。
まとめ
1行の修正ですが、ガード条件が実際にメソッドを持つ正しいオブジェクトを参照するようになり、Minitest 6以降のAPIへの対応が意図どおりに機能します。respond_to? を使ったバージョン互換処理では、レシーバーの選択が正確さを左右するという点を改めて示す変更です。