代码之家  ›  专栏  ›  技术社区  ›  Obromios

升级到Rails6后,邮件程序测试延迟的\u作业不起作用

  •  0
  • Obromios  · 技术社区  · 6 年前

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

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

    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> 这似乎是正确的,所以这个问题可能不是由这个引起的 rails 6 issue

    如果我使用

    UserMailer.some_message.deliver
    

    我该怎么解决这个问题?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Obromios    6 年前

    作为一种解决方法,Rspec config块中的以下内容有效

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

        2
  •  0
  •   rossinboulder    6 年前

    我遇到了类似的问题,发现Rails6似乎正在调用ActiveJob::TestHelper::TestQueueAdapter( https://api.rubyonrails.org/files/activejob/lib/active_job/test_helper_rb.html )作为测试期间的默认队列适配器。因此,当您稍后在测试用例中使用.deliver\发送电子邮件时,可以检查邮件是否已使用 断言已排队的作业 ActionMailer::Base.deliveries .