【问题标题】:Sidekiq queue failing in test - requires separate Redis processSidekiq 队列在测试中失败 - 需要单独的 Redis 进程
【发布时间】:2016-11-29 02:47:43
【问题描述】:

除非 Redis 单独运行,否则使用 Sidekiq::Queue 实例运行 RSpec 测试会失败。

Sidekiq::Queue.new('my-queue').select(&:item)

在测试中引发错误

Redis::CannotConnectError:
   Error connecting to Redis on localhost:6379 (Errno::ECONNREFUSED)

我已将常规添加到规范助手中:

require 'sidekiq/testing'
Sidekiq::Testing.inline!

还有mock_redis 到 gemfile。

# gemfile
gem 'mock_redis', '0.16.1'

使用sidekiq (3.4.2)

如何更新我的配置以使其正常工作?

【问题讨论】:

  • 定义“测试失败”
  • @SergioTulentsev 更新了问题。它引发了Redis::CannotConnectError
  • 你是否在测试中将模拟的 redis 传递给 sidekiq?它不会自动工作。
  • @SergioTulentsev 我刚刚想出了一个解决方案并在下面发布了该答案。你说的是这个吗?
  • 不,不是。

标签: ruby-on-rails sidekiq


【解决方案1】:

mock_redis 只提供了一个假的redis。它不会拦截/替换实际的 redis 类/连接。如果你打算在测试中使用假 redis,你应该告诉 sidekiq。在您的config/initializers/sidekiq.rb(或任何您的sidekiq redis 配置中):

redis = if Rails.env.test?
  require 'mock_redis'
  MockRedis.new
else
  { url: 'redis://redis.example.com:7372/12' }
end

Sidekiq.configure_server do |config|
  config.redis = redis
end

Sidekiq.configure_client do |config|
  config.redis = redis
end

【讨论】:

    【解决方案2】:

    我通过在 spec_helper.rb 文件中为标记的 RSpec 测试模拟 Redis 解决了这个问题。

    config.before(:each, redis: true) do
      mock = MockRedis.new
      allow(Redis).to receive(:new).and_return(mock)
    end
    

    然后在场景中:

    scenario "my scenario with redis", redis: true do
      ...
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多