我正在将我的Rails 5应用中的大多数邮件程序移植到使用deliver_later而不是deliver_now的过程中。
当我在浏览器中测试时,我的一个邮件工作正常,但是当我在集成测试中运行它时却没有。 (我甚至使用我的测试环境启动了我的rails服务器,并使用与我的集成测试完全相同的数据在浏览器中进行了测试,它在浏览器中运行良好,但集成测试失败)。
集成测试失败并显示错误:
错误 - :执行ActionMailer :: DeliveryJob时出错(作业ID: 19648c1c9-81e1-4209-b97b-0feb1e22fad3)来自Async(邮件程序)的65.64ms: ActionView :: Template :: Error(未定义的方法`message_text' for 零:NilClass):
我的电子邮件模板中触发错误的行是:
<p><%= simple_format(@message.message_text )%></p>
当从集成测试调用邮件程序而不是在浏览器中调用邮件程序时,我完全难以理解为什么我的@message对象为nil。
相关代码:
jobs_controller:
cj = ContactJob.create!(job_id: @job.id, contact_id: id, message:message)
...
cj.send_job_email
contact_job.rb:
class ContactJob < ApplicationRecord
belongs_to :message
belongs_to :contact
belongs_to :job
validates :contact, uniqueness: {scope: :job}
validates :message, presence:true
def send_job_email()
ContactJobMailer.job(self.id).deliver_later
end
end
contact_job_mailer.rb:
def job (contact_job_id)
@cj = ContactJob.find(contact_job_id)
@contact=@cj.contact
@job= @cj.job
@message= @cj.message
mail to: @contact.email, subject: 'test'
end
集成测试:
patch update_contacts_user_job_path(@user, @job), params: {job: {contact_ids: [ @contact2.id], message: {message_text: "This is a test"}}}
只 @message对象是nil,只有当我作为集成测试的一部分运行它时,一切都在浏览器中正常工作。