Написание тестов с 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