如何测试延迟发送邮件?邮件入队断言的对象参数传递语法
解决Rails中带对象参数的邮件入队断言问题
我来帮你理清这个困惑——在Rails里使用assert_enqueued_email_with断言带对象参数的邮件入队,核心是要匹配邮件方法接收的参数数组格式,下面给你详细拆解正确用法:
核心要点
assert_enqueued_email_with的args选项需要接收一个数组,这个数组要和你传递给邮件方法的参数完全对应——哪怕只有一个对象参数,也得用数组把它包起来。
正确代码示例
假设你的ContactMailer的welcome方法接收一个Contact对象作为参数:
# app/mailers/contact_mailer.rb class ContactMailer < ApplicationMailer def welcome(contact) @contact = contact mail(to: contact.email, subject: "Welcome!") end end
对应的测试代码应该这样写:
# test/mailers/contact_mailer_test.rb test "welcome email is enqueued with contact object" do @contact = Contact.create!(name: "Jane Doe", email: "jane@example.com") # 正确的断言写法:args是包含@contact的数组 assert_enqueued_email_with ContactMailer, :welcome, args: [@contact] do ContactMailer.welcome(@contact).deliver_later end end
常见错误纠正
你之前尝试的args: @contact(没有用数组包裹)是错误的,因为Rails会把邮件方法的参数以数组形式存储在队列任务中,所以断言时必须用数组来匹配参数列表。
多参数场景扩展
如果你的邮件方法需要多个参数,比如:
def welcome(contact, inviter) # ... end
那么断言时的args就要对应包含两个对象的数组:
assert_enqueued_email_with ContactMailer, :welcome, args: [@contact, @inviter] do ContactMailer.welcome(@contact, @inviter).deliver_later end
内容的提问来源于stack exchange,提问作者Tom Rossi
相关产品推荐
相关产品推荐

