ActionMailer deliver_later可以在浏览器中运行,但不能在测试套件中运行

时间:2018-04-02 18:22:40

标签: ruby-on-rails actionmailer minitest

我正在将我的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,只有当我作为集成测试的一部分运行它时,一切都在浏览器中正常工作。

0 个答案:

没有答案