Как проверить Devise Async с помощью Sidekiq?
Заранее спасибо! Sidekiq работает просто отлично, но мне не удается протестировать его с помощью Devise Async, или я должен сказать, что не могу протестировать последнее?
Согласно документации Sidekiq, когда тестовый режим установлен на fake!, любое задание, переданное работнику, помещается в массив с именем 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: подделка! и встроенный!
Что мне не хватает?
2 ответа
Как указано в документации, вы можете проверить размер очереди как
Sidekiq::Extensions::DelayedMailer.jobs.size
Работал над этой проблемой, случайно наткнувшись на красивую реализацию, выполненную gitlab, которая, как мне показалось, может быть полезна при тестировании devise-async или электронной почты, которые проталкиваются через очередь 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
Вы заметили бы, что в этой тестовой реализации
- заставит sidekiq запустить задание вместо постановки в очередь,
- Атрибут электронной почты модели пользователя должен быть вызван
email
или вы можете просто заменить код выше. ActionMailer::Base.deliveries.map(&:to).flatten.count(user.email) == 1
проверьте, чтобы ActionMailer::Base.deliveries доставлял user.email