如何在 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])
我刚刚发现一堆单元测试失败了,因为开发人员没有在测试中模拟对 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])