繁体   English   中英

Python 模拟 requests.post 抛出异常

[英]Python mock requests.post to throw exception

使用 Python 3.5,requests==2.18.4,Flask==0.12.2,urllib3==1.22

我的主server.py文件中有一个some_method方法,它应该使用一些数据对某个 url 进行POST

def some_method(url, data):
    ...
    error = None
    try:
        response = requests.post(url, json=data)
    except requests.exceptions.ConnectionError as e:
        ...
        app.logger.error(...)
        response = None
        error = str(e)
    return error, response

服务器文件定义: app = Flask(__name__) ,并且some_method是从@app.route(... methods=['PATCH'])调用的。
如果此方法抛出错误,则路由最终将返回500

测试从使用import serverapp = server.app导入应用程序的测试文件运行,使用unittest ,并导入mock.patch

我能够测试整个应用程序的行为,测试表明当方法返回错误并看到路由在正确的位置终止时,应用程序路由的行为符合预期:

class ServerTestCase(unittest.TestCase):
    ...
    @patch('server.some_method')
    def test_route_response_status_500_when_throws(self, mock_response):
        mock_response.return_value = 'some_error_string', None
        response = self.app.patch(some_url, some_data, content_type='application/json')
        self.assertEqual(response.status_code, 500)

但是,我真的很想进行另一个测试来some_method测试some_method

  1. 模拟requests.post抛出requests.exceptions.ConnectionError
  2. 表明该方法记录了一个错误(我知道我可以模拟我的app.logger并断言它在执行期间记录了)

模拟requests.post函数,并在模拟中将side_effect属性设置为所需的异常:

@patch('requests.post')
def test_request_post_exception(self, post_mock):
    post_mock.side_effect = requests.exceptions.ConnectionError()
    # run your test, code calling `requests.post()` will trigger the exception.

从链接的文档:

这可以是在调用模拟时要调用的函数、可迭代或要引发的异常(类或实例)。

[...]

引发异常的模拟示例(用于测试 API 的异常处理):

 >>> mock = Mock() >>> mock.side_effect = Exception('Boom!') >>> mock() Traceback (most recent call last): ... Exception: Boom!

(粗体强调我的)。

这也包含在快速指南部分

side_effect允许您执行副作用,包括在调用模拟时引发异常:

 >>> mock = Mock(side_effect=KeyError('foo')) >>> mock() Traceback (most recent call last): ... KeyError: 'foo'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM