我的代码如下:
import pytest
import requests
from unittest import mock
@mock.patch('requests.get')
def test_verify(mock_request):
mock_resp = mock.Mock()
mock_resp.status_code = 404
mock_request.return_value = mock_resp
r = requests.get()
with pytest.raises(requests.exceptions.HTTPError) as err_msg:
r.raise_for_status()
print(err_msg)
由于响应的状态代码设置为 404,我预计会引发 HTTPError。但是,有一个错误说明
Failed: DID NOT RAISE <class 'requests.exceptions.HTTPError'>
输出如下:
======================================== test session starts ======================================== platform darwin -- Python 3.6.4, pytest-3.7.0, py-1.5.2, pluggy-0.7.1 rootdir: /Users/michael/Code/youtube-data-api, inifile: plugins: requests-mock-1.5.2 collected 1 item
temp_test.py F
[100%]============================================= FAILURES ============================================== ____________________________________________ test_verify ____________________________________________
mock_request =
@mock.patch('requests.get') def test_verify(mock_request): mock_resp = mock.Mock() mock_resp.status_code = 404 mock_request.return_value = mock_resp r = requests.get() #print(r.status_code) with pytest.raises(requests.exceptions.HTTPError) as err_msg: r.raise_for_status() E Failed: DID NOT RAISE <class 'requests.exceptions.HTTPError'>
temp_test.py:15: Failed ===================================== 1 failed in 0.12 seconds ======================================
终端输出:
最佳答案
mock_resp
是一个 mock.Mock()
对象。调用 raise_for_status()
只会返回另一个 Mock()
。
您需要使用保留原始 raise_for_status()
的响应。试试这个:
import pytest
import requests
from unittest import mock
@mock.patch('requests.get')
def test_verify(mock_request):
mock_resp = requests.models.Response()
mock_resp.status_code = 404
mock_request.return_value = mock_resp
res = requests.get()
with pytest.raises(requests.exceptions.HTTPError) as err_msg:
res.raise_for_status()
print(err_msg)
关于python - pytest 不会使用 mock.patch 引发 HTTPError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51639531/