为什么我的工作在测试期间没有执行?

use*_*483 4 rspec ruby-on-rails ruby-on-rails-4 ruby-on-rails-5

这是我的代码的一个小描述(简化)

应用程序/工作/

class GenerateInvoiceJob < ActiveJob::Base
  queue_as :default

  def perform()
    Invoice.create
  end
end
Run Code Online (Sandbox Code Playgroud)

应用程序/模型/

class Product < ActiveRecord::Base
  def buy
    GenerateInvoiceJob.perform_later
  end
end
Run Code Online (Sandbox Code Playgroud)

规格/工作

RSpec.describe AnotherJob, type: :job do

  context "with filter" do
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

规格/型号

RSpec.describe Product, type: :model do


    describe '#buy' do
      it "should generate invoice" do
        Product.create().buy

        expect(Invoice.all.size).to eq 1
      end
    end
end
Run Code Online (Sandbox Code Playgroud)

带导轨 4.2.11

当我跑步时

rspec 规格/模型/product_spec.rb

然后测试就可以了(工作已执行)

当我跑步时

rspec spec -e '应生成发票'

然后测试失败,导致作业未执行

如果我从规范/作业中删除所有测试作业然后运行

rspec spec -e '应生成发票'

然后测试就可以了(工作已执行)

我不明白为什么对某些工作进行测试会阻止其他工作的执行?有解决办法吗?

带导轨 5 和导轨 6

无论我做什么,测试总是失败,因为工作从未执行?

自 Rails 5 以来,测试期间不再执行作业吗?

感谢帮助

第一个答案后更新 1:

非常感谢您的回答,只是为了确保我做得正确:

我在environment/test.rb中添加了 config.active_job.queue_adapter = :test

在我的spec/models/product_spec.rb中

class GenerateInvoiceJob < ActiveJob::Base
  queue_as :default

  def perform()
    Invoice.create
  end
end
Run Code Online (Sandbox Code Playgroud)

不确定我放了

    ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
Run Code Online (Sandbox Code Playgroud)

在好地方?!

phi*_*kov 7

您需要设置:

ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
Run Code Online (Sandbox Code Playgroud)

然而,使用have_enqueued_job是更常见的方法。

编辑:还有一种更简单的方法让我忘记了:

ActiveJob::Base.queue_adapter = :inline
Run Code Online (Sandbox Code Playgroud)