2012-05-08 41 views
14

我有一个用redis缓存数据的模型类。我第一次调用模型的方法时,它会计算JSON/Hash值并将其存储在Redis中。在某些情况下,我会刷新这些数据,并在下次调用时重新计算。用Rails编写测试用RSpec for 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和水豚。如果有帮助,我也使用Cucumber和Capabara进行集成测试。

回答

18

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

只要确保您拨打REDIS.flushbefore(:each)区块或相应的黄瓜挂钩。

您可以独立测试data_to_cache Redis的,但除非你能完全信任你使用Redis的驱动程序,它提供了合同,它的安全来实际测试cache_data(以及相应的缓存中提取方法)居住。这也可以让你切换到不同的redis驱动程序(或不同的快速KV商店),而无需对您的测试进行全面重写。

+11

我相信现在是'REDIS.flushdb' –

17

首先添加下面的代码在spec_helper.rb所以你就可以确保测试将即使没有安装Redis的服务器的任何机器上运行:

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

以后,我测试:

  1. 的数据写入到Redis的是预期的数据
  2. cache_data,flush_data的序列,cache_data调用data_to_cache两次
+0

所以你建议让redis运行并实际测试数据与redis的交互。这使得在运行测试时运行redis的依赖性(我一般不反对)。但它增加了一个依赖关系,我可以看到有些人可能会建议使用存根处理。 –

+0

不是。这就是MockRedis正在做的......它将数据存储在内存中,所以你不需要一个redis服务器。我说:“所以即使没有安装redis服务器,你也可以确保测试可以在任何机器上运行”。您可能要添加到这个答案的顶部,这是非常有益的 – bcd

+10

的一件事是:加'宝石“mock_redis''您的Gemfile这行添加到您的spec_helper以及'需要” mock_redis'' –