2012-05-08 53 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'' –