pytest 不会使用 mock.patch 引发 HTTPError

Mic*_*Liu 9 python pytest python-requests python-unittest

我的代码如下:

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)
Run Code Online (Sandbox Code Playgroud)

由于响应的状态代码设置为 404,我预计会引发 HTTPError。但是,有一个错误说明

Failed: DID NOT RAISE <class 'requests.exceptions.HTTPError'>
Run Code Online (Sandbox Code Playgroud)

输出如下:

======================================== 测试会话开始====== ================================== 平台达尔文 -- 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 收集了1个项目

temp_test.py F
[100%]

==============================================失败==== ======================================================================

模拟请求 =

@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'>
Run Code Online (Sandbox Code Playgroud)

temp_test.py:15: 失败 ====================================== 1 次失败在 0.12 秒内 = ======================================

终端输出: 终端输出

who*_*ski 9

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)
Run Code Online (Sandbox Code Playgroud)