适用于特定作业的 ActiveJob 内联队列适配器

问题描述 投票:0回答:3

有没有办法将 ActiveJob 队列适配器设置为内联特定后台作业?

就我而言,我想在测试中运行一些后台作业来构建集成测试。我不关心作业内部细节,因为我的目的只是运行后台作业并断言结果。然而,这些集成测试并没有涵盖所有后台作业,所以我不想全局设置队列适配器。

ruby-on-rails ruby rails-activejob
3个回答
6
投票

您可以使用 RSpec 的 around_hook 功能:

module WithQueueAdapter
  def with_queue_adapter(new_adapter)
    around do |example|
      begin
        old_adapter = ActiveJob::Base.queue_adapter
        ActiveJob::Base.queue_adapter = new_adapter
        example.run
      ensure
        ActiveJob::Base.queue_adapter = old_adapter
      end
    end
  end
end


RSpec.configure do |config|
  config.extend WithQueueAdapter
end

在你的测试中

describe "My cool feature" do
  with_queue_adapter :inline

  # examples go there
end

2
投票

ActiveJob::Base 的 queue_adapter 类属性可以在任何作业类上设置,它将影响作业类本身和任何子类。所以你可以有类似的东西

class JobThatMustRunInlineWhileTesting < ActiveJob::Base
  if Rails.env.test?
    queue_adapter :inline
  end

  # rest of your job
end

0
投票

在作业级别覆盖适配器

class SendmessageJob < ApplicationJob
  queue_as :default
  self.queue_adapter = :async
  
  
  def perform(*args)
    # TwilioMessenger.send_text_message(full_message)
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.