19

我有一个将数据缓存在 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

我应该如何对这段代码进行单元测试?我使用 RSpec 和 Capybara。如果有帮助,我还会使用 Cucumber 和 Capabara 进行集成测试。

4

2 回答 2

22

我喜欢在测试运行时运行 redis。Redis 与 postgres 不同,速度非常快,并且不会显着减慢测试运行时间。

只要确保你调用REDIS.flush了一个before(:each)块,或者相应的黄瓜钩子。

您可以data_to_cache独立于 redis 进行测试,但除非您可以完全信任您正在使用的 redis 驱动程序及其提供的合约,否则实时测试cache_data(以及相应的缓存获取方法)会更安全。这也允许您切换到不同的 redis 驱动程序(或不同的快速 KV 存储),而无需大规模重写您的测试。

于 2012-05-15T08:29:48.753 回答
21

首先,在 spec_helper.rb 中添加以下代码,这样即使未安装 redis 服务器,您也可以确保测试将在任何机器上运行(确保在测试范围下添加到 gemfile mock_redis 中:

redis_instance = MockRedis.new
Redis.stub(:new).returns(redis_instance)
Redis::Store.stub(:new).returns(redis_instance)

之后我会测试:

  1. 写入 REDIS 的数据是预期的数据
  2. 一系列cache_data、flush_data、cache_data调用data_to_cache两次
于 2012-05-08T19:31:57.693 回答