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

时间:2016-11-14 20:32:40

标签: ruby-on-rails ruby rails-activejob

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

在我的情况下,我想在测试中运行一些后台作业来构建集成测试。我不打扰工作内部细节,因为我的目的只是运行后台作业并断言结果。但是,这些集成测试并未涵盖所有后台作业,因此我不想全局设置队列适配器。

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

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

这样的东西
class MyCustomWidget(self):
    _qt_designer = False
    def __init__(self, parent):
        if self._qt_designer:
            # only while inside qt designer
        # do init

class MyPlugin(QPyDesignerCustomWidgetPlugin):
    def __init__(self, parent=None):
        super().__init__(parent)
        MyCustomWidget._qt_designer = True # set class variable

    def createWidget(self, parent):
        return MyCustomWidget(parent)