首页 > 解决方案 > 使用设计邮件发送作业进行 Rspec 测试

问题描述

我有一个功能,用户在首次注册后 2、10 和 26 天后会收到完成注册的提醒。例如,如何测试电子邮件是否不会发送。首次注册后 6 天?

工作/remind_users_without_banker_about_unconfirmed_account.rb

class RemindUsersWithoutBankerAboutUnconfirmedAccount < ApplicationJob
  NUMBER_OF_DAYS_SINCE_CREATION = [2, 10, 26].freeze

  def perform
    RemindUnconfirmedUsersWithoutBanker.call(NUMBER_OF_DAYS_SINCE_CREATION)
  end
end

这是一项执行所有操作的服务

服务/remind_unconfirmed_users_without_banker.rb

class RemindUnconfirmedUsersWithoutBanker < ApplicationService
  def call(number_of_days)
    return Failure(:invalid_value) if invalid?(number_of_days)

    users_to_mail = unconfirmed_users_not_created_by_bank_employees(number_of_days)
    return Failure(:no_matching_users) if users_to_mail.empty?

    resend_invitation(users_to_mail)
    Success(nil)
  end

  private

  def unconfirmed_users_not_created_by_bank_employees(number_of_days)
    days_mapped_with_date = number_of_days.map { |day| day.days.ago.to_date }

    User.where("users.bank_employee_id IS ?
                AND users.confirmed_at IS ?
                AND DATE(users.created_at) IN (?)",
               nil,
               nil,
               days_mapped_with_date)
  end

  def invalid?(number_of_days)
    number_of_days.any? { |number_of_day| !number_of_day.is_a?(Integer) || number_of_day < 1 }
  end

  def resend_invitation(users_to_mail)
    users_to_mail.each do |user|
      Devise::Mailer.confirmation_instructions(user, user.confirmation_token).deliver_later
    end
  end
end

而且我有一个规范,其中返回失败并且规范是绿色的,但它并不完全模拟发送电子邮件

RSpec.describe RemindUnconfirmedUsersWithoutBanker do
  subject(:remind_unconfirmed_users) { described_class.call(number_of_days) }

  let(:number_of_days) { [2, 10, 26] }

  before do
    ActiveJob::Base.queue_adapter = :test
    allow(InvitationMailer).to receive_message_chain(:confirmation_instructions, :deliver)
  end

  context "when created_at equals to 6 days" do
    it "does not invite user again" do
      create_list(:user, 2, created_at: 6.days.ago, confirmed_at: nil)
      expect(remind_unconfirmed_users).to eq(Failure(:no_matching_users))
    end
  end

有没有更好的方法来检查这些电子邮件是否仅在提到的日期(2、10、26)发送?

标签: ruby-on-railsrspec

解决方案


推荐阅读