ruby-on-rails - 使用设计邮件发送作业进行 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)发送?
解决方案
推荐阅读
- python - Tkinter 中的可滚动框架
- amazon-web-services - 无法安装/使用 AWS 工具 Powershell cmdlet
- php - 在 PHP 中排队作业
- python - 在 VPS 上使用 python 套接字的 winerror 10061
- powershell - 简单查询在 Powershell_ISE 中不起作用,但在 Powershell 上不起作用
- javascript - 文档的 Firestore 数据聚合
- python - 使用 pool.map 进行多处理时无法腌制本地对象
- excel - Excel计算最高颜色值
- asp.net-core - Asp net core env vars不适用于array-within-array appsettings Serilog属性
- php - 运行 docker-php-ext-install pdo mcrypt mbstring 时出错