2015-01-09 27 views
13

Mam ten kod, aby przetestować ActiveJob i ActionMailer z rspec nie wiem jak naprawdę wykonać wszystkie skolejkowany pracęExecute oczekującą pracę z ActiveJob w 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 
+0

Może to pomoże https://medium.com/@chuckjhardy/testing-rails-activejob-with-rspec -5c3de1a64b66 – CharlesJHardy

Odpowiedz

10

właściwy sposób testować będzie sprawdzić numer zakolejkowanych zadań, jak w twoim przykładzie, a następnie przetestuj każde zadanie osobno. Jeśli chcesz zrobić testy integracyjne można spróbować perform_enqueued_jobs pomocnika:

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 

Zobacz ActiveJob::TestHelper docs

+3

Czy ktoś może pokazać mniej zmyślony przykład tego, jak by to wyglądało z programem pocztowym akceptującym argumenty? Wydaje mi się, że nie działa to z czymś takim jak 'OrderMailer.receipt_email (order.id)'. –

14

Oto jak rozwiązać podobny 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 

Następnie w specyfikacji możemy użyć:

it "should perform immediately", perform_enqueued: true do 
    SomeJob.perform_later 
end 
+0

Świetna odpowiedź. Dodałem to do pliku w specyfikacji/support. Wydaje się, że jest to w 100% niezbędne do testowania wartości e-mail w testach integracyjnych. – justingordon