web-dev-qa-db-ja.com

Pythonでredisクライアントをモックする方法は?

開発者がテスト内の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
_

何かアドバイスはありますか?

15
Houman

副作用を使用して、ローカル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

これはテストされていませんが、私はそれがあなたが望むことをするべきだと思います

16
user3012759