2015-05-29 2 views
0

Возможно ли доступ к «реальным» объектам, издеваясь над модулем? То, что я пытаюсь сделать, это насмешка некоторых функций, но бросить «реальное» исключение, как это:Python макет доступа к «реальным» объектам, в то время как насмехается над модулем

@mock.patch('my_project.requests') 
def test_foo(self, mock_requests): 

    mock_requests.post = mock.Mock(side_effect=requests.ConnectionError()) 

    thread = CommandThread("command", 3, 2, 0) 
    thread.run() #this is were I exercise requests.post 

    self.assert(thread.was_successful is False) 

Внутри моей CommandThread у меня есть чек, как

try: 
    requests.post(url, data=data) 
except (requests.ConnectionError, requests.Timeout): 
    self.was_successful = False 

однако, мой тест не потому, что исключение не попало в блок try/except (когда мне нравится except Exception:). Причина, я думаю, просто потому, что я издевался над этим «пространством имен» в своем тестовом примере, поэтому я фактически делаю исключение вместо my_project.requests.ConnectionError , requests.ConnectionError из оригинальной упаковки. Как можно получить доступ к «реальным» исключениям?

ответ

1

Это происходит потому, что ваш макет фактически переписывает весь модуль запросов в вашем коде. Вот как вы можете отлаживать это:

В своем коде, добавьте это:

try: 
    requests.post('', data='') 
except (requests.ConnectionError, requests.Timeout): 
    was_successful = False 
except Exception, err: 
    import pdb 
    pdb.set_trace() 

При выполнении теста, вы попадёте в отладчик, так что вы можете взглянуть на то, что происходит может , Если мы посмотрим на то, что вы ловлю, это то, что мы видим:

(Pdb) requests.ConnectionError 
<MagicMock name='requests.ConnectionError' id='4562438992'> 

Вы на самом деле ловить макет ConnectionError, потому что ваш макет заплату из модуля целых запросов и вы питались в реальной ошибке запросов.

Вы можете это исправить, сделав ваш макет более конкретным и только переопределение метода пост на модуле запросов:

@mock.patch('my_project.requests.post') 
def test_foo(self, mock_requests): 
    mock_requests.side_effect = requests.ConnectionError() 
    ...