You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试教程:如何验证Sidekiq任务是否入队另一个Sidekiq任务

编写PaymentCheckJob的RSpec测试

首先确保测试环境配置Sidekiq测试支持,比如把rspec-sidekiq添加到Gemfile的test组,执行bundle install完成依赖安装。

以下是完整的测试用例:

require 'rails_helper'

RSpec.describe PaymentCheckJob, type: :job do
  # 假设你有Invoice工厂,这里创建payment_type为'ticket'的测试账单
  let(:invoice) { create(:invoice, payment_type: 'ticket') }
  let(:job_args) { { 'invoice_id': invoice.id }.to_json }

  before do
    # 清除Sidekiq所有队列,保证测试隔离性
    Sidekiq::Worker.clear_all
  end

  it "首次运行时,当payment_type为'ticket'会入队1小时后的PaymentCheckJob" do
    # 立即执行当前Job,模拟首次运行场景
    described_class.perform_now(job_args)

    # 验证是否有对应任务被加入预定队列
    expect(described_class).to have_enqueued_sidekiq_job(job_args)
      .at(a_value_within(1.second).of(1.hour.from_now))
  end
end

关键细节说明

  • 用let创建符合测试条件的invoice实例,确保payment_type为'ticket'
  • before块清除队列,避免其他测试任务干扰当前验证
  • perform_now直接执行Job,跳过Sidekiq队列调度,模拟首次触发逻辑
  • have_enqueued_sidekiq_job验证任务入队状态,at方法结合a_value_within处理时间精度误差,确保任务预定在1小时后执行

补充适配点

如果你的Job实际用perform_in(3600, ...)替代perform_at,可以把断言改成:

expect(described_class).to have_enqueued_sidekiq_job(job_args).in(1.hour)

另外要注意原Job代码里的invoice变量未定义,实际运行时需要补充invoice = Invoice.find(invoice_id)逻辑,否则测试会报错。

内容的提问来源于stack exchange,提问作者Felipe Junges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:02:06