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

Hou*_*man 15 python unit-testing mocking python-mock

我刚刚发现一堆单元测试失败了,因为开发人员没有在测试中嘲笑对redis客户端的依赖.我试图在这个问题上伸出援助之手,但我自己也有困难.

该方法写入redis客户端:

redis_client = get_redis_client()
redis_client.set('temp-facility-data', cPickle.dumps(df))
Run Code Online (Sandbox Code Playgroud)

稍后在断言中检索结果:

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)
Run Code Online (Sandbox Code Playgroud)

我设法成功修补了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)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何设置return_valueget(),以什么样的set()将在代码中设置,从而使测试将通过.

现在,这条线未通过测试:

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

有什么建议吗?

use*_*759 17

认为您可以使用副作用来设置并获取本地字典中的值

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
Run Code Online (Sandbox Code Playgroud)

没有经过测试,但我认为它应该做你想要的

  • 您能提供更多背景信息吗?(编写一个完整的测试,包括模拟创建、您测试的代码中的实际获取/设置用法)。另外,如何防止连接崩溃,我想即使您模拟 get/set,池连接(以及任何其他网络相关的连接)仍然会崩溃。 (3认同)

Nar*_*rek 7

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

@patch("redis.Redis", return_value=fakeredis.FakeStrictRedis())
def test_something():
....
Run Code Online (Sandbox Code Playgroud)