期望Sidekiq Job接收带有参数Rspec的Async



我有以下Worker

class JobBlastingWorker
include Sidekiq::Worker
sidekiq_options queue: 'job_blasting_worker'
def perform(job_id, action=nil)
job = Job.find(job_id)
JobBlastingService.new(job).call
end
end

我还有以下job_blasting_service

class JobBlastingService
def initialize(job)
@job = job
end
def call
ScoringWorker.perform_async(@job.id, 0, 'create')
end
end

scoring_worker

class ScoringWorker
include Sidekiq::Worker
sidekiq_options queue: 'scoring_worker'
def perform(job_id, version, action=nil)
job = Job.find(job_id)
job.version = version
job.save
end
end

现在我想写一个rspec测试来验证发送给ScoringWorker的参数是准确的。

require 'rails_helper'
describe JobBlastingWorker do
before(:all) do
Rails.cache.clear
end
describe 'perform' do
context 'create' do
it 'sends correct arguments for scoring worker' do
@job = create(:job)
expect(ScoringWorker).to receive(:perform_async).with(@job.id, 0, 'create').and_call_original
worker = JobBlastingWorker.new
expect(JobBlastingWorker).to receive(:perform_in)
expect(ScoringWorker).to receive(:perform_async).exactly(1).times
worker.perform(@job.id, 'create')
end
end
end
end

我有这个rspec测试,当我运行它时,我得到一个错误,因为它没有任何sidekiq作业与参数。

我如何编写这个测试,以获得所需的响应

如果你只是想验证你发送的参数是正确的,像这样的东西应该让你接近:

subject(:job_blasting_worker) { described_class.perform_later(job_id, version, action) }
let(:job) { create :job }
it 'queues the job' do
expect { job_blasting_worker }.to have_enqueued_job(described_class).with(
job.id,
0,
'create'
).on_queue(if you have different queues)
end
end

最新更新