Подтвердить что ты не робот

Выполнение незавершенного задания с помощью ActiveJob в rspec

У меня есть этот код для тестирования 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
4b9b3361

Ответ 1

Вот как я решил аналогичную проблему:

# 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

Ответ 2

Правильный способ тестирования - проверить количество заданий в очереди, как в вашем примере, а затем проверить каждое задание отдельно. Если вы хотите выполнить интеграционное тестирование, вы можете попробовать выполнить команду 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