簡體   English   中英

模擬請求異常不會被side_effect拋出

[英]Mock requests exception not being thrown by side_effect


因此,我正在嘗試測試異常處理代碼,並且side_effect無法正常工作。 打印的輸出表明它正在進行調用,但是raise_for_status沒有正確地在side_effect中引發異常。 為什么不引發異常?

更新:好的,不知道為什么會這樣,但是至少可以使它掉入正確的位置。 我將其更改為使用patch.object,並為side_effect提供了模擬raise_for_status和模擬獲取對象HTTPError()。 這樣可以將其放到正確的except塊中,但是根據單元測試,它仍然沒有引發異常。

這是位於test_package中的代碼test_src.py:

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)

所以輸出是:

{'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

----------------------------------------------------------------------

似乎您正在修補錯誤的對象。 您應該在test_src.requests修補get函數。 將裝飾器更改(不要移動)為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM