【问题标题】:How to mock requests using pytest? [duplicate]如何使用 pytest 模拟请求? [复制]
【发布时间】:2019-12-30 23:07:59
【问题描述】:

我正在编写一些单元测试代码,我想模拟在我的函数中使用的 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 模拟请求?有可能吗?

【问题讨论】:

    标签: python pytest


    【解决方案1】:

    您可以使用requests-mock (PyPI),还有一个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)
    

    【讨论】:

    • 但是我如何从函数get_employee(id)模拟行requests.get(f'{__BASE_URL}/employee/{id}')
    • 可以返回404吗?
    • 是的。只需添加一个status=404 作为get 函数的参数。
    • 什么是正确的.package?到处都找不到。
    • @Zizzipupp 我认为from correct.package import __BASE_URL 是您项目的包,您可以在其中找到您尝试模拟的资源的基本 URL。我认为它可以在配置模块的某个地方找到。
    【解决方案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!"
    

    【讨论】:

    • 此答案不使用问题中明确要求的pytest
    猜你喜欢
    • 1970-01-01
    • 2022-07-04
    • 2020-04-25
    • 2021-10-02
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多