python - pytest 不会使用 mock.patch 引发 HTTPError

标签 python python-requests pytest 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)

由于响应的状态代码设置为 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 ======================================

终端输出: terminal output

最佳答案

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/

相关文章:

python - 如何在python的graphql查询中修复 'parse error on (VAR_SIGN)'

python - 使用 python requests 伪装成浏览器并下载文件

python - 强制从 URL 下载图像的最长时间

python - Peewee SQL 查询连接,其中没有一个匹配

从 python 解释器调用时的 Python argparse

python - 如何将固定装置传递给 pytest.mark.parametrize?

unit-testing - py.test : dump stuck background threads at the end of the tests

python - 使用pytest如何快速显示失败详情?

python - 打包python资源(Manifest.in vs package_data vs data_files)

python - 使用请求时的Python错误处理