2016-05-19 2 views
0

Так что я пытаюсь проверить код обработки исключений, а side_effect работает неправильно. Печатный результат показывает, что он выполняет вызовы, но raise_for_status неправильно выбрасывает исключение в side_effect. Почему исключение не выбрасывается?Исключение блокировки запросов, не выбрасываемых side_effect

ОБНОВЛЕНИЕ: Хорошо, не знаю, почему это работает, но, по крайней мере, оно заставляет забросить вправо, за исключением. Я изменил его, чтобы использовать patch.object, и дал как макет raise_for_status, так и mock получить объекты HTTPError() для side_effect. Это заставило его спуститься в правильный блок, но он все равно не выбрал исключение в соответствии с модульными тестами.

Это код test_src.py расположен в test_package:

import requests 
import sys 
import traceback 

def test_requests_function(): 
try: 
    response = requests.get('https://google.com/api/test', verify=False) 
    response.raise_for_status() 
    return response.json() 
except requests.exceptions.RequestException as error: 
    return_message = "Exception: {0}".format(str(error)) 
    return {'return_code' : 500, 'message' : return_message, 'traceback' : traceback.format_exc()} 
except: 
    return_message = "Unknown Exception: {0}".format(str(sys.exc_info()[0])) 
    return {'return_code' : 500, 'message' : return_message, 'traceback' : traceback.format_exc()} 

Это тестовый код:

import unittest 
from pprint import pprint 
import mock 
import requests 

from test_package import test_src 

class TestRequestTestCase(unittest.TestCase): 
    @mock.patch.object(requests, 'get') 
    def test_request_exception(self, mock_get): 
    http_error = requests.exceptions.HTTPError('Unable to connect') 
    mock_raise_for_status = mock.Mock(side_effect=http_error) 
    mock_get.raise_for_status = mock_raise_for_status 
    mock_get.side_effect = http_error 

    return_json = test_src.test_requests_function() 
    print "\nMock_Get:" 
    print id(mock_get) 
    pprint(mock_get.__dict__) 
    print "\nMock_Raise_For_Status:" 
    print id(mock_raise_for_status) 
    pprint(mock_raise_for_status.__dict__) 
    print "\n" 
    pprint(return_json) 

Так ouptut является:

{'message': 'Exception: Unable to connect', 
'return_code': 500, 
'traceback': 'Traceback (most recent call last):\n File "/Users/yshaban/test/test_package/test_src.py", line 8, in test_requests_function\n response = requests.get(\'https://google.com/api/test\', verify=False)\n File "/Users/yshaban/test/lib/python2.7/site-packages/mock/mock.py", line 1062, in __call__\n return _mock_self._mock_call(*args, **kwargs)\n File "/Users/yshaban/test/lib/python2.7/site-packages/mock/mock.py", line 1118, in _mock_call\n raise effect\nHTTPError: Unable to connect\n' 
} 

====================================================================== 

FAIL: test_request_exception (__main__.TestRequestTestCase) 

---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Users/yshaban/test/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched 
    return func(*args, **keywargs) 
    File "unit_tests.py", line 36, in test_request_exception 
    pprint(return_json) 
AssertionError: RequestException not raised 

---------------------------------------------------------------------- 
+0

Я не знаю, как работает тестовый каркас, является «ответом» на макет тестового объекта? Если это так, вы уверены, что ИТ не справляется с исключениями? В третьем разделе вывода я заметил, что '_mock_side_effect' является' HTTPError() '. – dfoverdx

+0

Еще одна вещь, которую я заметил ... Вывод говорит, что 'request.exceptions.HTTPError' является неизвестным исключением, так что, возможно, это имеет какое-то отношение к нему? – dfoverdx

ответ

0

кажется вам исправляют неправильный объект. Вы должны исправить функцию get в test_src.requests. Измените (не перемещайте) декоратор на:

@mock.patch.object(test_src.requests, 'get')