2015-05-29 2 views
3

У меня есть функция в классе под названием «my_class» в модуле, который называется «my_module», который содержит этот фрагмент:Исключение не вызывается при использовании side_effect с притворным

try: 
    response = self.make_request_response(requests.post, data, endpoint_path) 
except requests.exceptions.HTTPError as err: 
    if err.response.status_code == requests.codes.conflict: 
    logging.info('Conflict error') 

И я пытаюсь проверить это как так:

error = requests.exceptions.HTTPError(mock.Mock(response=mock.Mock(status_code=409)), 'not found') 
mock_bad = mock.Mock(side_effect=error) 
mock_good = mock.Mock() 
mock_good.return_value = [{'name': 'foo', 'id': 1}] 


upsert = my_module.my_class(some_data) 
with mock.patch.object(upsert, 'make_request_response', side_effect=[mock_bad, mock_good]) as mock_response: 
    some_function() 

Что бы я ожидал, это связано с тем, что HTTPError будет поднят в тесте после того, как я его исправлю. Однако, когда я запускаю тест, исключение никогда не возникает. «Ответ» на самом деле установлен в mock_bad, который содержит желаемое исключение, хотя он никогда не поднимается. Любая идея, где я ошибаюсь?

ответ

3

Вы помещаете свое исключение в неправильный побочный эффект. Вызов make_request_response() теперь сначала возвращает макет mock_bad, который сам по себе не будет поднимать это исключение до вызова.

Помещенный исключение в списке mock.patch.object()side_effect:

error = requests.exceptions.HTTPError(mock.Mock(response=mock.Mock(status_code=409)), 'not found') 
mock_good = mock.Mock() 
mock_good.return_value = [{'name': 'foo', 'id': 1}] 


upsert = my_module.my_class(some_data) 
with mock.patch.object(upsert, 'make_request_response', side_effect=[error, mock_good]) as mock_response: 
    some_function()