Написание тестов с RSpec для Redis с Rails
У меня есть класс модели, который кэширует данные в redis. В первый раз, когда я вызываю метод на модели, он вычисляет значение JSON/Hash и сохраняет его в Redis. При определенных обстоятельствах я "очищаю" эти данные, и их пересчитывают при следующем вызове.
Здесь фрагмент кода, аналогичный тому, который я использую для хранения данных в 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
Как мне unit test этот код? Я использую RSpec и Capybara. Я также использую Cucumber и Capabara для тестирования интеграции, если это помогает.
Ответы
Ответ 1
Мне нравится, когда redis работает во время тестов. Redis, в отличие от, например, postgres, очень быстро и не замедляет время тестового запуска.
Просто убедитесь, что вы вызываете REDIS.flush
в блок before(:each)
или соответствующий крючок огурца.
Вы можете протестировать data_to_cache
независимо от redis, но если вы не можете полностью доверять используемому драйверу redis, который вы используете, и заключенному ему контракту, безопаснее тестировать cache_data
(и соответствующий метод кэширования) в реальном времени. Это также позволяет вам переключиться на другой драйвер redis (или в другой быстрый магазин KV) без оптовой перезаписи ваших тестов.
Ответ 2
Прежде всего добавьте приведенный ниже код в spec_helper.rb, чтобы убедиться, что тесты будут выполняться на любом компьютере, даже если сервер redis не установлен:
redis_instance = MockRedis.new
Redis.stubs(:new).returns(redis_instance)
Redis::Store.stubs(:new).returns(redis_instance)
После этого я проверил:
- Данные, записанные в REDIS, являются ожидаемыми данными
- Последовательность cache_data, flush_data, cache_data дважды вызывает data_to_cache