引入sidekiq/testing后Sidekiq仍尝试连接Redis的问题
问题描述
环境信息
- Ruby版本:3.1.3
- Rails版本:7.0.4
- Sidekiq版本:Standard
- 依赖:sidekiq-status
配置代码
sidekiq.rb初始化文件
# frozen_string_literal: true require "sidekiq" require "sidekiq-status" redis_config = { url: "#{ENV["REDIS_URL"]}/#{REDIS_SIDEKIQ_DB}" } Sidekiq.configure_client do |config| config.redis = redis_config Sidekiq::Status.configure_client_middleware config, expiration: 30.minutes.to_i end Sidekiq.configure_server do |config| config.redis = redis_config Sidekiq::Status.configure_server_middleware config, expiration: 30.minutes.to_i Sidekiq::Status.configure_client_middleware config, expiration: 30.minutes.to_i end
spec_helper.rb配置片段
... require 'sidekiq-status/testing/inline' config.before(:each) do Sidekiq::Worker.clear_all end
测试文件my_file_spec.rb
require 'rails_helper' RSpec.describe ExpirationCartJob, type: :job, focus: true do it { should be_retryable(false) } it { should respond_to(:perform) } it "should be able to enqueue a job" do expect { described_class.perform_async }.to enqueue_sidekiq_job end end
报错现象
运行测试时触发Redis连接错误,回溯信息显示Sidekiq尝试使用无效URL /2 连接Redis,抛出ArgumentError。按照官方文档,引入sidekiq/testing后应模拟任务执行,不连接真实Redis,但当前项目仍尝试建立Redis连接。
解决方案
1. 修复测试环境Redis配置变量
无效URL /2 是因为ENV["REDIS_URL"]为空,拼接后得到无效路径。在测试环境中确保这两个变量有有效值:
# 在spec_helper.rb开头添加 ENV["REDIS_URL"] ||= "redis://localhost:6379" REDIS_SIDEKIQ_DB ||= 2
2. 调整测试模式加载顺序与配置
确保sidekiq测试模式优先加载,并重置Redis配置为测试专用:
# spec_helper.rb中调整顺序 require 'sidekiq/testing' require 'sidekiq-status/testing/inline' # 强制测试环境使用独立Redis配置 Sidekiq.configure_client do |config| config.redis = { url: 'redis://localhost:6379/15' } # 测试专用DB,避免污染其他环境数据 end config.before(:each) do Sidekiq::Worker.clear_all Sidekiq::Status.reset # 重置sidekiq-status的状态存储 end
3. 测试环境跳过sidekiq-status中间件
测试场景下不需要状态跟踪,修改sidekiq.rb,仅在非测试环境加载sidekiq-status中间件:
# frozen_string_literal: true require "sidekiq" redis_config = if Rails.env.test? { url: "redis://localhost:6379/15" } else { url: "#{ENV["REDIS_URL"]}/#{REDIS_SIDEKIQ_DB}" } end Sidekiq.configure_client do |config| config.redis = redis_config unless Rails.env.test? require "sidekiq-status" Sidekiq::Status.configure_client_middleware config, expiration: 30.minutes.to_i end end Sidekiq.configure_server do |config| config.redis = redis_config unless Rails.env.test? require "sidekiq-status" Sidekiq::Status.configure_server_middleware config, expiration: 30.minutes.to_i Sidekiq::Status.configure_client_middleware config, expiration: 30.minutes.to_i end end # 测试环境单独加载测试支持 if Rails.env.test? require "sidekiq-status/testing/inline" end
4. 验证sidekiq-status版本兼容性
Sidekiq 7.x对API有调整,确保sidekiq-status使用兼容版本。更新Gemfile:
gem 'sidekiq-status', '~> 1.2' # 确认版本适配Sidekiq 7.x,可查看官方README确认最新兼容版
执行bundle update sidekiq-status更新依赖。
内容的提问来源于stack exchange,提问作者sheva
相关产品推荐
相关产品推荐

