パパエンジニアのアウトプット帳

30歳に突入した1児のパパエンジニアのブログ

ActiveJob::TestHelperでセットされるTestAdapterを無効にしたい場合

下記のように ActiveJob::TestHelperをincludeしているとqueue_adapterが強制的にTestAdapterになります。

[spec/rails_helper.rb]
RSpec.configure do |config|
  config.include ActiveJob::TestHelper
end

RSpecのJobのテストとかを書く分には便利なアサーションメソッドとかも使えて便利なのですが、本当にJobを実行したい場合もあります。 今回はActionCableのChannelでJob.perform_laterしてそのジョブで処理が完了したらbroadcastするようなものだったので、同期ではなく非同期でJobを実行したかったです。


初めは Rails.application.config.active_job.queue_adapter = :async としてqueue_adapterを切り替えようとしていたのですが、どうもTestAdapterから切り替わっていないようでした。(設定直後くらいでbinding.pryして止めても確かにAsyncAdapterにはなっている)


どうにかして部分的にAsyncAdapterに切り替えたいなと調べていると下記を見つけました。 github.com

disable_test_adapterというメソッドを呼ぶことでActiveJob::TestHelperでセットされるTestAdapterを無効にできるようです。 Rails6になった頃、config/environments/test.rbのqueue_adapter設定が無視されるのがあったんですね。

qiita.com

これでasyncアダプターに切り替えて非同期でJobを実行できるようになりました。

補足

同期実行で問題ない場合は下記で見つけた perform_enqueued_jobs を利用すると同期実行にできます。 qiita.com