Как проверить 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

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

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