pytest 不会使用 mock.patch 引发 HTTPError

pytest does not raise HTTPError using mock.patch

我的代码如下:

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() 只会调用 return 另一个 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)