我有一个Rails Active作业,可以使用不同的参数创建相同类型的多个其他作业。我想测试该作业是否使其他作业具有正确的参数。
这基本上是我要实现的目标:
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作业,但这不是必需的。
您可以直接检查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