web-dev-qa-db-ja.com

rspecのActiveJobで保留中のジョブを実行する

ActiveJobとActionMailerをRspecでテストするためのこのコードがあります。キューに入れられたすべてのジョブを実際に実行する方法がわかりません。

describe 'whatever' do
  include ActiveJob::TestHelper

  after do
    clear_enqueued_jobs
  end  

  it 'should email' do
    expect(enqueued_jobs.size).to eq(1)
  end
end
17
Olivier

これが私が同様の問題を解決した方法です:

# Rails_helper.rb
RSpec.configure do |config|
  config.before :example, perform_enqueued: true do
    @old_perform_enqueued_jobs = ActiveJob::Base.queue_adapter.perform_enqueued_jobs
    @old_perform_enqueued_at_jobs = ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs
    ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
    ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = true
  end

  config.after :example, perform_enqueued: true do
    ActiveJob::Base.queue_adapter.perform_enqueued_jobs = @old_perform_enqueued_jobs
    ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = @old_perform_enqueued_at_jobs
  end
end

次に、仕様で使用できます。

it "should perform immediately", perform_enqueued: true do
  SomeJob.perform_later  
end
21
timsly

テストする適切な方法は、例のようにキューに入れられたジョブの数を確認してから、各ジョブを個別にテストすることです。統合テストを行いたい場合は、perform_enqueued_jobsヘルパーを試すことができます。

describe 'whatever' do
  include ActiveJob::TestHelper

  after do
    clear_enqueued_jobs
  end  

  it 'should email' do
    perform_enqueued_jobs do
      SomeClass.some_action
    end
  end

end

ActiveJob :: TestHelper docs を参照してください

15
Alex Ponomarev