Redisのテスト
環境の切り替えはnamespaceとか使うべきなのかな…と思っていたらcauses/mock_redisを見つけました。
>> require 'mock_redis'
>> mr = MockRedis.new
>> mr.set('some key', 'some value')
=> "OK"
>> mr.get('some key')
=> "some value"
と言った形でredisの操作をmock出来るgemです。
RSpecへの適応
テスト実行時にlocalのredis等を使わないようにします。
spec_helper.rb
require 'mock_redis'
RSpec.configure do |config|
config.before(:all) do
# for Spring
$redis.client.reconnect
end
config.before(:each) do
redis_instance = MockRedis.new
Redis.stub(:new).and_return{ redis_instance }
# for redis cache.
#Redis::Store.stub(:new).and_return{ redis_instance }
# 追記
$redis = Redis.new
end
追記
initializerのタイミングがMockよりも先なのでspec_helper内で$redisを生成し直す形に変更しました。
と言うか今までMock出来てなかったのか…。
Redis.new
した時にMockRedis.new
を返します。
Springを利用している場合は
Redis::InheritedError:
Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking.
が出てしまうので、before(:all)
内で再接続させています。
$redis
はinitializers内で
config/initializers/redis.rb
redis_config = YAML.load_file(Rails.root.join('config', 'redis.yml'))[Rails.env]
$redis = Redis.new(:host => redis_config['host'], :port => redis_config['port'])
と言った感じで設定しています。