steel
steel

Reputation: 12520

Sidekiq queue failing in test - requires separate Redis process

Running an RSpec test with a Sidekiq::Queue instance is failing unless Redis is running separately.

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

Raises error in test

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

I've added the usual to the spec helper:

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

And mock_redis to the gemfile.

# gemfile
gem 'mock_redis', '0.16.1'

Using sidekiq (3.4.2)

How can I update my configuration to allow this to work?

Upvotes: 1

Views: 1271

Answers (2)

Sergio Tulentsev
Sergio Tulentsev

Reputation: 230276

mock_redis only provides with a fake redis. It does not intercept/replace actual redis classes/connections. If you intend to use fake redis in tests, you should tell sidekiq so. In your config/initializers/sidekiq.rb (or whereever your sidekiq redis config is):

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

Upvotes: 1

steel
steel

Reputation: 12520

I solved this by mocking Redis for tagged RSpec tests in the spec_helper.rb file.

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

Then in the scenario:

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

Upvotes: 0

Related Questions