I have a model class that caches data in redis. The first time I call a method on the model, it computes a JSON/Hash value and stores it in Redis. Under certain circumstances I ‘flush’ that data and it gets recomputed on the next call.
Here’s the code snippet similar to the one I use to store the data in Redis:
def cache_data self.data_values = data_to_cache REDIS.set(redis_key,ActiveSupport::JSON.encode(self.data_values)) REDIS.get(redis_key) end def data_to_cache // generate a hash of values to return end
How should I unit test this code? I use RSpec and Capybara. I also use Cucumber and Capabara for integration testing if that helps.
I like to have redis running while the tests are running. Redis, unlike e.g. postgres, is extremely fast and doesn’t slow down test run time noticeably.
Just make sure you call
REDIS.flush in a
before(:each) block, or the corresponding cucumber hook.
You can test
data_to_cache independently of redis, but unless you can fully trust the redis driver you’re using and the contract it provides, it’s safer to actually test
cache_data (and the corresponding cache fetch method) live. That also allows you to switch to a different redis driver (or to a different fast KV store) without a wholesale rewrite of your tests.
First of all add the below code in the spec_helper.rb so you’ll be sure that the tests will run on any machine even if the redis server is not installed:
redis_instance = MockRedis.new Redis.stubs(:new).returns(redis_instance) Redis::Store.stubs(:new).returns(redis_instance)
After that I would test:
- The data written to REDIS is the expected data
- A sequence of cache_data, flush_data, cache_data calls the data_to_cache twice