如何使用 pytest 模拟请求?

26 python pytest

我正在编写一些单元测试代码,我想模拟requests在我的函数中使用的模块:

import requests

def get_employee(id):
    resp = requests.get(f'{__BASE_URL}/employee/{id}')
    if resp.status_code == 404:
        return None

    return resp.json()
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下代码模拟它:

def test_get_employee(mocker):
    get_request_mock = mocker.patch.object(get_employee, "resp")
    print(get_request_mock)
    get_request_mock.status_code = 200
    get_request_mock.json.return_value = {'name': 'awesome-mock'}
    resp = get_employee('random-id')
    assert resp == {'name': 'awesome-mock'}
Run Code Online (Sandbox Code Playgroud)

如何使用 mocker 模拟请求?有可能吗?

ndc*_*clt 26

您可以使用requests-mock ( PyPI ),有一个用于 pytest 用法的固定装置。

对于您的示例:

from correct.package import __BASE_URL
from requests import HTTPError


def test_get_employee(requests_mock):
    test_id = 'random-id'
    requests_mock.get(f'{__BASE_URL}/employee/{test_id}', json= {'name': 'awesome-mock'})
    resp = get_employee('random-id')
    assert resp == {'name': 'awesome-mock'}

def test_absent_employee(requests_mock):
    test_id = 'does_not_exist'
    requests_mock.get(f'{__BASE_URL}/employee/{test_id}', status_code=404)
    with pytest.raises(HTTPError):
        resp = get_employee(test_id)
Run Code Online (Sandbox Code Playgroud)

  • 但是我如何模拟函数“get_employee(id)”中的“requests.get(f'{__BASE_URL}/employee/{id}')”行呢? (2认同)
  • @Zizzipupp我认为`from Correct.package import __BASE_URL`意味着你的项目的包,其中找到了你试图模拟的资源的基本URL。我认为它可以在配置模块中的某个地方找到。 (2认同)