2014-11-21 14 views
8

Z góry dziękuję! Sidekiq działa dobrze, ale nie mogę go przetestować z Devise Async, czy powinienem powiedzieć, że nie mogę przetestować tego ostatniego?Jak testować Devise Async z Sidekiq?

Zgodnie z dokumentacją Sidekiqa, gdy tryb testowy jest ustawiony na fałszywe !, każde zadanie przydzielone pracownikowi jest przekazywane do tablicy o nazwie jobs tego samego pracownika. Zatem testowanie wzrostu tej tablicy jest trywialne.

Ale z Devise Async nie jest to takie banalne, chociaż jego backend zawiera Sidekiq::Worker. Oto krótka lista rzeczy, które starałem się testu:

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

Żaden z tych przedmiotów testowych wskazuje wzrost wielkości. Odkąd Devise wysyła swoje e-maile jako callbacki modeli, próbowałem testować zarówno w modelu, jak iw specyfikacji kontrolera. Używając Factory Girl i Database Cleaner, wypróbowałem także tryby: transakcja i obcięcie. Nie trzeba dodawać, że próbowałem także obu trybów Sidekiq: fake! i inline !.

Czego mi brakuje?

Odpowiedz

1

Jak wspomniano w documentation można sprawdzić rozmiar kolejki jako

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

Próbowałem tak wiele rzeczy. Dzięki! – kmanzana

0

pracuje nad tym problemem, przypadkiem na pięknej realizacji wykonanych przez gitlab który myślałem może być pomocne w testowaniu devise-asynchroniczny lub wiadomości e-mail, które są przekazywane za pośrednictwem kolejki sidekiq. spec_helper.rb email_helpers.rb

Dodając te linie w 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 

i dodanie /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 

Aby uruchomić test na przykład testowania zapomniałeś hasła, jestem przy założeniu, wiesz rspec, factorygirl , kapibara /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 

Można by zauważyć, że w tej implementacji testowej

  1. spowoduje sidekiq uruchomić zadanie zamiast enqueuing go
  2. Model atrybut e-mail, użytkownik musi być nazywany email lub można po prostu zastąpić kod powyżej.
  3. ActionMailer::Base.deliveries.map(&:to).flatten.count(user.email) == 1 wyboru, aby zobaczyć ActionMailer :: Base.deliveries jest dostarczanie do user.email