2015-01-09 4 views
13

ich diesen Code haben ActiveJob und Action mit Rspec Ich weiß nicht, zu testen, wie wirklich alle die Warteschlange eingereiht Job ausführenExecute anstehenden Job mit ActiveJob in 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

Vielleicht hilft dies https://medium.com/@chuckjhardy/testing-rails-activejob-with-rspec -5c3de1a64b66 – CharlesJHardy

Antwort

10

Der richtige Weg zu testen, wird Nummer überprüfen von eingereihten Jobs wie in Ihrem Beispiel, und testen Sie dann jeden Job separat. Wenn Sie Integrationstests tun möchten, können Sie perform_enqueued_jobs Helfer versuchen:

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 

Siehe ActiveJob::TestHelper docs

+3

Kann jemand ein weniger erfundenes Beispiel dafür zeigen, wie dies mit einem Mailer aussehen würde, der Argumente akzeptiert? Ich kann anscheinend nicht mit so etwas wie OrderMailer.receipt_email (order.id) arbeiten. –

14

Hier ist, wie ich ein ähnliches Problem gelöst:

# 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 

Dann Spezifikationen können wir verwenden:

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

Große Antwort. Ich habe das zu einer Datei in spec/support hinzugefügt. Scheint, dass dies 100% notwendig ist, um E-Mail-Werte in Integrationstests zu testen. – justingordon