2015-01-15 39 views
2

我正在寫一個緩存機制的測試。該機制有兩個緩存層,請求緩存和redis。請求緩存使用Flask.g,這是一個存儲請求持續時間值的對象。它通過在Flask.g._cache屬性上創建字典來完成此操作。單元測試應該知道它正在測試的功能多少?

但是,我認爲確切的屬性是我的單元測試不應該關心的實現細節。我想確保它將值存儲在Flask.g上,但我不關心它是如何實現的。什麼是測試這個的好方法?

我正在使用Python模擬模塊,所以我知道我可以模擬出Flask.g,但我不確定是否有辦法測試它是否有任何屬性訪問,而不關心它屬於哪個屬性。

這就是這樣的測試的正確方法嗎?

+1

而不是看你的測試* cache *的具體細節,爲什麼不確保'expensive_op_1'和'expensive_op_2'不會*多次調用?數據緩存在哪裏並不重要(就測試而言) - 它是*數據是否被緩存和重用,而不是重新請求你想測試的數據。 (或者我誤解了你的問題?) – 2015-01-16 02:27:51

+0

好吧,請求緩存比進行redis快很多。 – bigblind 2015-01-16 03:49:08

回答

0

就個人而言,如果您正在測試端點,您應該不會嘲諷Flask.g。因爲你會創建一個self.app(我可能不確定這個部分)

其次,你需要用類似這樣的返回結構模擬redis客戶端。

class RedisTestCase(object): 
    saved_dictionary = {} 
    def keys(self, pattern): 
     found_keys = [] 
     for key in RedisTestCase.saved_dictionary: #loop keys for pattern 
      if pattern: 
       found_keys.append(key) 
     return found_keys 

    def delete(self, keys): 
     for key in keys: 
      if key in RedisTestCase.saved_dictionary: 
       del RedisTestCase.saved_dictionary[key] 

    def mset(self, items): 
     RedisTestCase.saved_dictionary.update(items) 

    def pipeline(self): 
     return RedisTestCase()