升级到 rails 6 后,使用 delayed_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 (, , , ) 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 我在测试中使用 binding.pry 并检查 Rails.application.config.queue_adapter.queue 值是 #<ActiveJob::QueueAdapters::InlineAdapter:0x00007faefad1d408> 这似乎是正确的,所以这个问题可能不是由这个 rails 6 issue 引起的。

如果我用

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 检查邮件是否已排队,然后您可以实际执行 UserMailer使用 perform_enqueued_jobs 工作,那么您将能够从 ActionMailer::Base.deliveries.