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

引入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:14:51