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

如何在RSpec中测试触发Sidekiq的death_handlers死亡处理程序

测试Sidekiq death_handlers的RSpec实现方案

rspec-sidekiq的within_sidekiq_retries_exhausted_block是针对旧版Sidekiq重试耗尽回调的API,不适用于6.x+版本新增的death_handlers,所以会报方法不存在的错误,你可以通过以下两种方案完成测试:

方案1:单元测试直接调用death_handler(最快,适合验证回调逻辑本身)

直接从Sidekiq配置中取出你注册的回调,手动传入模拟参数验证执行结果即可:

RSpec.describe "Sidekiq death handlers" do
  # 取出你注册的death handler,如果你注册了多个可以按索引取对应项
  let(:death_handler) { Sidekiq.default_configuration.death_handlers.first }
  let(:mock_job) { { "class" => "TestWorker", "jid" => "test-jid-123" } }
  let(:mock_exception) { StandardError.new("test execution error") }

  it "throws the expected error when retries are exhausted" do
    expect {
      death_handler.call(mock_job, mock_exception)
    }.to raise_error(/Retries exhausted on TestWorker test-jid-123: #<StandardError: test execution error>./)
  end
end

方案2:端到端模拟重试耗尽流程(更贴近真实运行场景)

如果需要验证完整的任务执行到重试耗尽的全链路逻辑,可以手动修改任务重试次数触发回调:

require "sidekiq/testing"

RSpec.describe TestWorker, type: :worker do
  before do
    Sidekiq::Testing.fake!
    # 确保sidekiq初始器已加载,death handler已注册
    load Rails.root.join("config/initializers/sidekiq.rb")
  end

  it "triggers death handler after all retries are used up" do
    # 入队测试任务
    TestWorker.perform_async("test_param")
    # 取出队列内的任务对象
    job = Sidekiq::Queues["default"].first
    # 把重试次数设为最大值,模拟已经完成所有重试
    job["retry_count"] = Sidekiq.default_configuration.max_retries

    expect {
      # 执行任务抛出异常,触发重试耗尽逻辑
      Sidekiq::JobRetry.new(Sidekiq.default_configuration).attempt(job, Sidekiq::Queue.new("default")) do
        raise StandardError.new("task failed")
      end
    }.to raise_error(/Retries exhausted on TestWorker/)
  end
end
  • 如果你用ActiveJob封装的Sidekiq任务,只需要把模拟任务的class字段替换为对应的ActiveJob类名即可,逻辑完全通用。
  • 测试前可先打印Sidekiq.default_configuration.death_handlers确认回调已成功注册,避免初始器未加载导致的空列表问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:57:03