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

如何在Python中模拟redis客户端?,python,unit-testing,mocking,python-mock,Python,Unit Testing,Mocking,Python Mock,我刚刚发现很多单元测试都失败了,因为开发人员没有在测试中模拟出对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'))

我刚刚发现很多单元测试都失败了,因为开发人员没有在测试中模拟出对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\u值设置为
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

未对此进行测试,但我认为它应该做您想要的事情

使用
副作用
,在set
副作用
中设置共享对象,并在get
副作用
中返回?