Sidekiq队列在测试中失败 - 需要单独的Redis进程

时间:2016-11-28 17:26:59

标签: ruby-on-rails sidekiq

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

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)

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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