Execute pending job with ActiveJob in rspec

后端 未结 3 1333
伪装坚强ぢ
伪装坚强ぢ 2021-02-12 19:49

I have this code to test ActiveJob and ActionMailer with Rspec I don\'t know how really execute all enqueued job

describe \'whatever\' do
  include ActiveJob::         


        
相关标签:
3条回答
  • 2021-02-12 20:24

    Just combined all the best pieces, +included sidekiq:

    spec/support/perform_jobs.rb:

    require 'sidekiq/testing'
    
    RSpec.configure do |config|
      Sidekiq::Testing.fake!
    
      config.around(:each, perform_jobs: true) do |example|
        Sidekiq::Testing.inline! do
          queue_adapter = ActiveJob::Base.queue_adapter
          old_perform_enqueued_jobs = queue_adapter.perform_enqueued_jobs
          old_perform_enqueued_at_jobs = queue_adapter.perform_enqueued_at_jobs
          queue_adapter.perform_enqueued_jobs = true
          queue_adapter.perform_enqueued_at_jobs = true
          example.run
        ensure
          queue_adapter.perform_enqueued_jobs = old_perform_enqueued_jobs
          queue_adapter.perform_enqueued_at_jobs = old_perform_enqueued_at_jobs
        end
      end
    
    end
    
    

    spec/some_spec.rb:

    it 'works', perform_jobs: true do
      ...
    end
    
    0 讨论(0)
  • 2021-02-12 20:25

    Here is how I solved a similar problem:

    # 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
    

    Then in specs we can use:

    it "should perform immediately", perform_enqueued: true do
      SomeJob.perform_later  
    end
    
    0 讨论(0)
  • 2021-02-12 20:27

    The proper way to test will be to check number of enqueued jobs as in your example, and then test each job separately. If you want to do integration testing you can try perform_enqueued_jobs helper:

    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
    

    See ActiveJob::TestHelper docs

    0 讨论(0)
提交回复
热议问题