繁体   English   中英

升级到 rails 6 后,带有 delay_job 的邮件程序测试不起作用

[英]Mailer tests with delayed_job not working after upgrade to rails 6

我正在使用rails 6.01delayed_job, 4.1.8 我已经设置了活动作业队列适配器

#config/environments/test.rb
config.active_job.queue_adapter = :inline

rspec 代码是

before(:each) { ActionMailer::Base.deliveries = [] }
it 'sends some message' do
      UserMailer.delay.some_message
      mail = ActionMailer::Base.deliveries  
      expect(mail.count).to eq 1
end

此测试失败,计数为 0。查看日志,邮件消息已排队进入 DelayedJob 但未执行:

Delayed::Backend::ActiveRecord::Job Create (0.4ms)  INSERT INTO "delayed_jobs" ("handler", "run_at", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["handler", "--- !ruby/object:Delayed::PerformableMailer\nobject: !ruby/class 'UserMailer'\nmethod_name: :some_message"], ["run_at", "2019-12-12 18:29:26.457639"], ["created_at", "2019-12-12 18:29:26.458062"], ["updated_at", "2019-12-12 18:29:26.458062"]]

使用F I binding.pry在测试和检查Rails.application.config.queue_adapter.queue值为#<ActiveJob::QueueAdapters::InlineAdapter:0x00007faefad1d408>这似乎是正确的,所以这个问题可能不是由此引起的轨道6问题

如果我使用

UserMailer.some_message.deliver

测试通过,因此邮件程序没有任何问题。

我该如何解决?

作为解决方法,Rspec 配置块中的以下内容有效

  config.before do
      Delayed::Worker.delay_jobs = false
  end

但是,我仍然希望回答这个问题。

我遇到了类似的问题,发现 Rails 6 似乎在调用 ActiveJob::TestHelper::TestQueueAdapter ( https://api.rubyonrails.org/files/activejob/lib/active_job/test_helper_rb.html ) 作为默认队列适配器测试。 因此,当您在测试用例中发送带有 .deliver_later 的电子邮件时,您可以使用assert_enqueued_jobs检查邮件是否已排队,然后您实际上可以使用perform_enqueued_jobs执行 UserMailer 作业,然后您将能够从ActionMailer访问实际邮件: :Base.deliveries

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM