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設定が無視されるのがあったんですね。
これでasyncアダプターに切り替えて非同期でJobを実行できるようになりました。
補足
同期実行で問題ない場合は下記で見つけた perform_enqueued_jobs
を利用すると同期実行にできます。
qiita.com