2015-05-29 29 views
10

我剛剛發現一堆單元測試失敗了,因爲開發者沒有在測試中嘲笑對redis客戶端的依賴。我試圖在這件事情上伸出援手,但自己也有困難。如何在Python中模擬redis客戶端?

的方法寫一個Redis的客戶:

redis_client = get_redis_client() 
redis_client.set('temp-facility-data', cPickle.dumps(df)) 

在結果檢索到的斷言後來:

res = cPickle.loads(get_redis_client().get('temp-facility-data')) 
expected = pd.Series([set([1, 2, 3, 4, 5])], index=[1]) 
assert_series_equal(res.variation_pks, expected) 

我設法修補Redis的客戶端的get()和()設置成功。

@mock.patch('redis.StrictRedis.get') 
@mock.patch('redis.StrictRedis.set') 
def test_identical(self, mock_redis_set, mock_redis_get): 
    mock_redis_get.return_value = ??? 
    f2 = deepcopy(self.f) 
    f3 = deepcopy(self.f) 
    f2.pk = 2 
    f3.pk = 3 
    self.one_row(f2, f3) 

,但我不知道怎麼的get()return_value設置什麼set()將在代碼中設置,從而使測試將通過。

眼下這條線測試失敗:

res = cPickle.loads(get_redis_client().get('temp-facility-data')) 
TypeError: must be string, not MagicMock 

有什麼建議嗎?

+0

使用'side_effect'與共享的對象是在集合'side_effect'中設置並返回'side_effect'? https://docs.python.org/3/library/unittest.mock.html#quick-guide – user3012759

回答

9

認爲你可以使用副作用設置和在本地字典中獲得價值

data = {} 
def set(key, val): 
    data[key] = val 

def get(key): 
    return data[key] 

mock_redis_set.side_effect = set 
mock_redis_get.side_effect = get 

沒有測試過這一點,但我認爲它應該做你想要什麼

+0

它的工作原理。非常感謝+1 – Houman