Как насмехаться с клиентом redis в 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() и установить() успешно.

@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)

но я не знаю, как установить return_value of get() на то, что будет задано set() в коде, чтобы тест прошел.

Сейчас эта строка не проходит тест:

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

Любые советы, пожалуйста?

Ответ 1

Думаю, вы можете использовать побочный эффект для установки и получения значения в локальном dict

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

не тестировал это, но я думаю, что он должен делать то, что вы хотите