Ожидайте, что несколько активных заданий Rails одного и того же класса будут поставлены в очередь с разными параметрами.

У меня есть активное задание Rails, которое создает несколько других заданий того же типа с разными параметрами. Я хочу проверить, что это задание ставит в очередь другое задание с правильными параметрами.

Это в основном то, чего я пытаюсь достичь:

require 'rails_helper'

RSpec.describe TriggerJob, type: :job do
  include ActiveJob::TestHelper

  after do
    clear_enqueued_jobs
  end

  it 'enqueues jobs for all model instances' do
    model1 = create(:model)
    model2 = create(:model)
    model3 = create(:model)

    expect { described_class.perform_now }
      .to(have_enqueued_job(ModelJob).with { |arg| expect(arg.id).to be == model1.id }.exactly(:once))
      .and(have_enqueued_job(ModelJob).with { |arg| expect(arg.id).to be == model2.id }.exactly(:once))
      .and(have_enqueued_job(ModelJob).with { |arg| expect(arg.id).to be == model3.id }.exactly(:once))
  end
end

Это не работает, потому что кажется, что RSpec просто сопоставляет тип класса задания, а затем пытается сравнить аргументы первого задания с моим блоком. В зависимости от порядка в очереди это не удается. Я бы хотел, чтобы RSpec соответствовал ЛЮБЫМ заданиям ModelJob, поставленным в очередь, и терпел неудачу только в том случае, если не может найти совпадений в очереди.

Кроме того, я хотел бы проверить, что не существует других заданий ModelJob с другими параметрами, но на самом деле это не требуется.


person Strayer    schedule 28.04.2020    source источник


Ответы (1)


Вы можете проверить enqueued_jobs напрямую. Однако это не так красиво.

  it 'enqueues jobs for all model instances' do
    model1 = create(:model)
    model2 = create(:model)
    model3 = create(:model)

    described_class.perform_now

    job_classes = enqueued_jobs.map { |enqueued_job| enqueued_job[:job] }
    expect(job_classes).to eq([ModelJob] * 3)

    job_args = enqueued_jobs.map do |enqueued_job|
      ::ActiveJob::Arguments.deserialize(enqueued_job[:args])
    end
    expect(job_args.one? { |arg| arg.id == model1.id }).to eq(true)
    expect(job_args.one? { |arg| arg.id == model2.id }).to eq(true)
    expect(job_args.one? { |arg| arg.id == model3.id }).to eq(true)
  end
person Michaël Witrant    schedule 05.05.2020