首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中模拟redis客户端?

如何在Python中模拟redis客户端?
EN

Stack Overflow用户
提问于 2015-05-29 21:47:00
回答 3查看 14.3K关注 0票数 20

我刚刚发现很多单元测试都失败了,因为开发人员没有在测试中模拟出对redis客户端的依赖。我想在这件事上帮个忙,但我自己也有困难。

该方法写入到redis客户端:

代码语言:javascript
复制
redis_client = get_redis_client()
redis_client.set('temp-facility-data', cPickle.dumps(df))

稍后在断言中检索结果:

代码语言:javascript
复制
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()。

代码语言:javascript
复制
@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()在代码中设置的值,以便通过测试。

现在,这一行没有通过测试:

代码语言:javascript
复制
res = cPickle.loads(get_redis_client().get('temp-facility-data'))
TypeError: must be string, not MagicMock

有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-29 22:35:38

我认为你可以使用副作用来设置和获取局部字典中的值

代码语言:javascript
复制
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

没有对此进行测试,但我认为它可以做您想要的事情

票数 24
EN

Stack Overflow用户

发布于 2021-11-18 18:14:16

如果你想要更完整的东西,你可以试试fakeredis

代码语言:javascript
复制
@patch("redis.Redis", return_value=fakeredis.FakeStrictRedis())
def test_something():
....
票数 2
EN

Stack Overflow用户

发布于 2022-01-02 20:09:54

我认为你可以做这样的事情。

代码语言:javascript
复制
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])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30531291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档