如何使用pytest模拟请求?

时间:2019-08-26 18:46:39

标签: 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()

我尝试使用以下代码对其进行模拟:

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用mock-request,其中有fixture用于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)

答案 1 :(得分:2)

这可能会帮助

from unittest import TestCase

import requests
import requests_mock


class TestHTTPRequest(TestCase):
    def test_context_manager(self):
        with requests_mock.Mocker() as mock_request:
            mock_request.get("http://123-fake-api.com", text="Hello!")
            response = requests.get("http://123-fake-api.com")

        assert response.text == "Hello!"