Sidekiq 8.1.1対応:テスト用インラインモード設定の修正
Rails 8.1.1で、Sidekiqのテストモード設定が新しいAPIに対応しました。Sidekiq 8.1.1で sidekiq/testing/inline が非推奨となったことに伴い、バージョンに応じた適切な設定方法に切り替えています。
背景
Sidekiq 8.1.1以前は、require "sidekiq/testing/inline" によってテストモードでジョブを即座に実行する設定が可能でした。この require 文は内部的に sidekiq/testing を読み込み、さらにそれが sidekiq 本体を読み込む仕組みになっていました。
Sidekiq 8.1.1では、sidekiq/testing/inline が非推奨となり、代わりに Sidekiq.testing!(:inline) メソッドが導入されました。この変更に伴い、sidekiq/testing から sidekiq 本体への自動的な require が削除されたため、Rails側で明示的に sidekiq を読み込む必要が生じました。
技術的な変更
activejob/test/adapters/sidekiq.rb の設定が、Sidekiqのバージョンに応じた分岐処理に変更されました。
変更前:
require "sidekiq/testing/inline"
ActiveJob::Base.queue_adapter = :sidekiq
変更後:
require "sidekiq"
if Sidekiq.respond_to? :testing! # 8.1.1
Sidekiq.testing!(:inline)
else
require "sidekiq/testing/inline"
end
ActiveJob::Base.queue_adapter = :sidekiq
まず require "sidekiq" で本体を明示的に読み込み、その後 Sidekiq.respond_to? :testing! でバージョンを判定します。Sidekiq 8.1.1以降であれば新しい Sidekiq.testing!(:inline) を呼び出し、それ以前のバージョンでは従来の require "sidekiq/testing/inline" を使用します。
設計判断
後方互換性を保つバージョン判定方式が採用されました。
respond_to? を使った動的な判定により、Sidekiq 8.1.1より前のバージョンでも動作を維持しています。バージョン番号の文字列比較ではなく、メソッドの存在確認によって判定することで、実装の詳細に依存しない堅牢な分岐を実現しています。
コメント # 8.1.1 を残すことで、この分岐が特定のバージョンに対応するものであることを明示し、将来的なメンテナンスを容易にしています。
まとめ
本PRは、Sidekiq 8.1.1の非推奨化対応により生じた require の依存関係の変化に対処した修正です。respond_to? による判定で新旧両方のAPIをサポートし、Railsのテストスイートが複数のSidekiqバージョンで動作し続けることを保証しています。