2014-11-21 3 views
8

Заранее спасибо! Sidekiq работает нормально, но я не могу проверить его с помощью Devise Async, или я должен сказать, что я не могу проверить последнее?Как протестировать асинхронный режим с Sidekiq?

Согласно документации Sidekiq, когда режим тестирования установлен на подделку!, Любое задание, заданное работнику, переносится в массив с именем jobs того же работника. Так что тривиально проверять увеличение этого массива.

Но, с помощью Devise Async, это не так тривиально, хотя его бэкэнд включает Sidekiq::Worker. Вот небольшой список вещей, которые я пытался испытания:

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

Ни один из этих испытательных предметов не указывает увеличение размера. Поскольку Devise отправляет свои электронные письма в качестве обратных вызовов моделей, я пробовал тестировать как в модели, так и в спецификации контроллера. Используя Factory Girl и Database Cleaner, я также попробовал оба режима: транзакцию и усечение. Излишне говорить, что я также пробовал оба режима Sidekiq: подделка! и inline !.

Что мне не хватает?

ответ

1

Как уже упоминалось в documentation, вы можете проверить размер очереди как

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

Я пытался так много вещей. Благодаря! – kmanzana

0

работает над этим вопросом, наткнулись на красивой реализации проделанной gitlab который я думал, может быть полезным при тестировании завещанию-асинхронном или электронной почты, которые нажимают через очередь sidekiq. spec_helper.rb email_helpers.rb

Добавив эти строки в 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 

И добавив /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 

Чтобы запустить тест на примере тестирования забыли пароль, я предполагаю, что вы знаете, RSpec, factorygirl , 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 

Вы заметили бы, что в этом тесте реализации

  1. заставит sidekiq выполнить задание вместо enqueuing его,
  2. модель атрибут электронной почты пользователя должен быть вызван email или вы можете просто заменить код выше.
  3. ActionMailer::Base.deliveries.map(&:to).flatten.count(user.email) == 1 чек, чтобы увидеть ActionMailer :: Base.deliveries поставляет в user.email
Смежные вопросы