почему моя работа не выполняется во время теста? - PullRequest
1 голос
/ 06 января 2020

вот небольшое описание моего кода (упрощенно)

app / jobs /

class GenerateInvoiceJob < ActiveJob::Base
  queue_as :default

  def perform()
    Invoice.create
  end
end

app / models /

class Product < ActiveRecord::Base
  def buy
    GenerateInvoiceJob.perform_later
  end
end

spec / jobs

RSpec.describe AnotherJob, type: :job do

  context "with filter" do
    ...
  end
end

spec / models

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

с рельсами 4.2.11

при запуске

rspe c spec / models / product_spe c .rb

, тогда тест в порядке (задание выполнено)

при запуске

rspe c spe c -e 'должен сгенерировать счет'

, тогда тест не пройден, потому что задание не будет выполнено

, если я удалю все тестовые задания из спецификации / заданий и затем выполню

rspe c spe c -e 'должен сгенерировать счет'

, тогда тест в порядке (задание выполнено)

Я могу ' не понимаю, почему наличие некоторых тестов на выполнение работ мешает выполнению других заданий? Есть ли решение для этого?

с рельсами 5 и рельсами 6

Что бы я ни делал, тест всегда не удался, так как задание никогда не выполнялось?

Разве это не задания Выполняется больше во время испытаний, так как рельсы 5?

спасибо за помощь

обновление 1 после первого ответа:

большое спасибо для вашего ответа просто чтобы убедиться, что я делаю правильно:

Я добавил в environment / test.rb config.active_job.queue_adapter =: test

и в моей спецификации / models / product_spe c .rb

  RSpec.describe Product, type: :model do
    describe '#buy' do
      it "should generate invoice" do
        ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
        Product.create().buy

        expect(Invoice.all.size).to eq 1
      end
    end
  end

не уверен, что положил

    ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true

в хорошее место?!

1 Ответ

1 голос
/ 07 января 2020

Вам необходимо установить:

ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true

Однако использование have_enqueued_job является более распространенным подходом.

РЕДАКТИРОВАТЬ: есть даже более простой способ, который ускользнул мой разум:

ActiveJob::Base.queue_adapter = :inline
...