如何解决pytest,带有失败的raise_for_status:未提高<class'requests.exceptions.HTTPError'>
这是为了记录我很久以来偶然发现的东西。
这不起作用。 try/except/else
子句将吞噬r.raise_for_status()
生成的异常。
import requests
from requests.exceptions import HTTPError
import pytest
import logging
def fetch(url):
"""HTTP request"""
try:
r = requests.get(url)
r.raise_for_status()
except HTTPError as err:
logging.warning(f'Fetching url failed {err}')
else:
print(r.data)
def test_fetch(mocker):
"""Test."""
mock_response = mocker.Mock(requests.Response)
expected_exc = HTTPError()
mock_response.raise_for_status.side_effect = expected_exc
mocker.patch.object(requests,'get')
requests.get.return_value = mock_response
r = fetch('http://httpbin.org/status/400')
with pytest.raises(HTTPError) as err_msg:
r.raise_for_status()
从pytest收到的错误消息是
example.py F [100%]
====================================================================== FAILURES =======================================================================
_____________________________________________________________________ test_fetch ______________________________________________________________________
mocker = <pytest_mock.plugin.MockFixture object at 0x1095cd100>
def test_fetch(mocker):
"""Test."""
mock_response = mocker.Mock(requests.Response)
expected_exc = HTTPError()
mock_response.raise_for_status.side_effect = expected_exc
mocker.patch.object(requests,'get')
requests.get.return_value = mock_response
with pytest.raises(HTTPError) as err_msg:
> fetch('http://httpbin.org/status/400')
E Failed: DID NOT RAISE <class 'requests.exceptions.HTTPError'>
example.py:25: Failed
------------------------------------------------------------------ Captured log call ------------------------------------------------------------------
WARNING root:example.py:12 Fetching url failed
=============================================================== short test summary info ===============================================================
FAILED example.py::test_fetch - Failed: DID NOT RAISE <class 'requests.exceptions.HTTPError'>
================================================================== 1 failed in 0.20s ==================================================================
我在下面给出了答案。
解决方法
如果您真的有需要,请在这里测试一下raise_for_status。有必要再次提出例外。
import requests
from requests.exceptions import HTTPError
import pytest
import logging
def fetch(url):
"""HTTP request"""
try:
r = requests.get(url)
r.raise_for_status()
except HTTPError as err:
logging.warning(f'Fetching url failed {err}')
# HERE raise again.
raise
else:
print(r.data)
def test_fetch(mocker):
"""Test."""
mock_response = mocker.Mock(requests.Response)
expected_exc = HTTPError()
mock_response.raise_for_status.side_effect = expected_exc
mocker.patch.object(requests,'get')
requests.get.return_value = mock_response
with pytest.raises(HTTPError) as err_msg:
fetch('http://httpbin.org/status/400')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。