升级到 rails 6 后,使用 delayed_job 进行的邮件程序测试无法正常工作
Mailer tests with delayed_job not working after upgrade to rails 6
我正在使用 rails 6.01
和 delayed_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.
我正在使用 rails 6.01
和 delayed_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.