2015-05-29 3 views
10

Я только что обнаружил, что куча модульных тестов терпит неудачу, потому что разработчик не издевался над зависимостью с клиентом redis в тесте. Я пытаюсь дать руку в этом вопросе, но испытываю трудности.Как насмехаться с клиентом redis в Python?

Метод записывает в 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 клиента() и установить() успешно ,

@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 из get() к тому, что set() будет установлен в коде, так что тест будет проходить.

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

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

Любые консультации, пожалуйста?

+0

использования 'side_effect' с общим объектом является установлен в наборе 'side_effect' и возвращен в get' side_effect'? https://docs.python.org/3/library/unittest.mock.html#quick-guide – user3012759

ответ

9

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

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 

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

+0

Работает. Большое спасибо +1 – Houman