簡體   English   中英

如何在 Python 中模擬 redis 客戶端?

[英]How to mock a redis client in 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() 和 set()。

@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

請問有什么建議嗎?

認為您可以使用副作用來設置並獲取本地字典中的值

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

沒有經過測試,但我認為它應該做你想要的

如果你想要更完整的東西,你可以嘗試fakeredis

@patch("redis.Redis", return_value=fakeredis.FakeStrictRedis())
def test_something():
....

我認為你可以做這樣的事情。

redis_cache = {
    "key1": (b'\x80\x04\x95\x08\x00\x00\x00\x00\x00\x00\x00\x8c\x04test\x94.', "test"),
    "key2": (None, None),
}
    
def get(redis_key):
    if redis_key in redis_cache:
        return redis_cache[redis_key][0]
    else:
        return None
    
mock = MagicMock()
mock.get = Mock(side_effect=get)
    
with patch('redis.StrictRedis', return_value=mock) as p:
    for key in redis_cache:
        result = self.MyClass.my_function(key)
        self.assertEqual(result, redis_cache[key][1])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM