🚀

ActiveSupport::Cache::RedisCacheStore利用時のMockRedisの扱い

2022/03/14に公開

概要

RailsのCacheStoreにActiveSupport::Cache::RedisCacheStoreを利用し、さらにMockRedisを利用してRedisをMockとして差し替え、特定の挙動(Rails.cache.state, Rails.cache.clear, etc)をすると、NoMethod Errorになる

undefined method `with' for #<MockRedis::Database:xx>

原因

ActiveSupport::Cache::RedisCacheStoreのコードを読むとわかるが、ConnectionPoolLikeというmoduleを::Redis::Redis::Distributedにincludeしている。

https://github.com/rails/rails/blob/92d204e7ac0275ec6b566559006fe64fa4319259/activesupport/lib/active_support/cache/redis_cache_store.rb#L22-L29

差し替えたMockRedisにはModuleがincludeされておらず、with methodが無いのでErrorになる。

対応

同様にMockRedisConnectionPoolLikeを実装しincludeすることで解決する。

::MockRedis.include(ActiveSupport::Cache::ConnectionPoolLike)

Discussion