首页 > 解决方案 > 如何使用 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()

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

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'}

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

标签: pythonpytest

解决方案


您可以使用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)

推荐阅读