2014-11-21 13 views
8

Vielen Dank im Voraus! Sidekiq funktioniert gut, aber ich kann es nicht mit Devise Async testen, oder sollte ich sagen, dass ich letzteres nicht testen kann?Wie Devise Async mit Sidekiq zu testen?

Laut Sidekiqs Dokumentation wird jeder Test, der einem Mitarbeiter zugewiesen wurde, in ein Array mit dem Namen jobs desselben Arbeiters versetzt, wenn der Testmodus auf "Fake!" Gesetzt ist. Es ist also trivial, den Anstieg dieses Arrays zu testen.

Aber mit Devise Async ist es nicht so trivial, obwohl sein Backend Sidekiq::Worker enthält. Hier ist eine kleine Liste der Dinge, die ich zu Test versucht:

  • Devise::Async::Backend::Sidekiq.jobs
  • Devise::Mailer.deliveries
  • ActionMailer::Base.deliveries
  • Devise::Async::Backend::Worker.jobs

Keine dieser Prüfung Probanden weist eine Zunahme der Größe. Da Devise seine E-Mails als Modellrückrufe sendet, habe ich versucht, sowohl in einem Modell als auch in einer Controller-Spezifikation zu testen. Mit Factory Girl und Database Cleaner habe ich auch beide Modi ausprobiert: Transaktion und Trunkierung. Unnötig zu sagen, dass ich auch beide Modi von Sidekiq ausprobiert habe: Fake! und Inline !.

Was fehlt mir?

Antwort

1

Wie in den documentation erwähnt, können Sie die Größe der Warteschlange als

Sidekiq::Extensions::DelayedMailer.jobs.size 
+0

Ich habe versucht, so viele Dinge zu sehen. Vielen Dank! – kmanzana

0

Arbeiten in dieser Frage überprüfen, zufällig auf einer schöne von Gitlab getan Implementierung, die ich dachte, könnte bei der Prüfung devise-Asynchron hilfreich sein, oder E-Mails, die über die sidekiq-Warteschlange gepusht werden. spec_helper.rb email_helpers.rb

Durch das Hinzufügen dieser Zeilen in spec_helper.rb

# An inline mode that runs the job immediately instead of enqueuing it 
require 'sidekiq/testing/inline' 

# Requires supporting ruby files with custom matchers and macros, etc, 
# in spec/support/ and its subdirectories. 
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f } 

RSpec.configure do |config| 
    config.include EmailHelpers 
    # other configurations line 
end 

und das Hinzufügen von /spec/support/email_helpers.rb

module EmailHelpers 
    def sent_to_user?(user) 
    ActionMailer::Base.deliveries.map(&:to).flatten.count(user.email) == 1 
    end 

    def should_email(user) 
    expect(sent_to_user?(user)).to be_truthy 
    end 

    def should_not_email(user) 
    expect(sent_to_user?(user)).to be_falsey 
    end 
end 

den Test zum Beispiel auszuführen Ihr Passwort vergessen Testen, ich gehe davon aus Sie rspec wissen, factory , capybara /spec/features/password_reset_spec.rb

require 'rails_helper' 

feature 'Password reset', js: true do 
    describe 'sending' do 
    it 'reset instructions' do 
     #FactoryGirl create 
     user = create(:user) 
     forgot_password(user) 

     expect(current_path).to eq(root_path) 
     expect(page).to have_content('You will receive an email in a few minutes') 
     should_email(user) 
    end 
    end 

    def forgot_password(user) 
    visit '/user/login' 
    click_on 'Forgot password?' 
    fill_in 'user[email]', with: user.email 
    click_on 'Reset my password' 
    user.reload 
    end 
end 

Sie würden, dass in diesem Test Implementierung bemerken

  1. wird sidekiq führen den Job statt Einreihen es laufen,
  2. Die E-Mail-Benutzermodell Attribut muss email aufgerufen werden oder man kann das einfach ersetzen Code oben.
  3. ActionMailer::Base.deliveries.map(&:to).flatten.count(user.email) == 1 Check Action :: Base.deliveries liefert user.email
Verwandte Themen