Как высмеять ответ от библиотечного api в pytest

Пишу pytest для функции, которая делает api вызов, используя установленный пакет. Как издеваться над ответом из api ответа?

Вот как выглядит функция

import hubspot
from pprint import pprint
from hubspot. import ApiException

def get_clicked_events():
    client = hubspot.Client.create(api_key="YOUR_HUBSPOT_API_KEY")

    try:
        api_response = client.events_api.get_page(limit=100, event_type="clicked")
        pprint(api_response)
        return api_response
    except ApiException as e:
        print("Exception when calling events_api->get_page: %s\n" % e)

Ознакомьтесь с requests-mock. Он предоставляет приспособление requests_mock, которое вы можете поместить в свою тестовую функцию. В функции вы имитируете вызов API с помощью requests_mock.get("https://api-url"), и по желанию добавляете ответ, код состояния и т.д.

В вашем случае вам нужно передразнить объект hubspot.Client, а затем передразнить соответствующие методы, которые вызываются. Ваша функция не имеет смысла просто печатать при возникновении ошибки, вы должны просто позволить ошибке распространиться до вызывающей стороны, откуда бы она ни исходила. Я немного изменил вашу функцию, чтобы она выдавала ошибку, чтобы показать это и как проверить оба сценария.

# src/get_events.py

from hubspot import Client
from hubspot.events.exceptions import ApiException

def get_clicked_events():
    client = Client.create(api_key="YOUR_HUBSPOT_API_KEY")

    try:
        api_response = client.events.get_page(limit=100, event_type="clicked")
    except ApiException:
        raise

    return api_response

from unittest.mock import patch

import pytest

from hubspot import Client
from hubspot.events.exceptions import ApiException

from src.get_events import get_clicked_events


def test_get_clicked_events_success():
    with patch("src.get_events.Client", spec=Client) as mock_client:
        mock_client.configure_mock(
            **{
                "create.return_value": mock_client,
                "events.get_page.return_value": "fizz"
            }
        )

        events = get_clicked_events()
        assert events == "fizz"


def test_get_clicked_events_fail():
    err_msg = "Failed to get events!"

    with patch("src.get_events.Client", spec=Client) as mock_client:
        mock_client.configure_mock(
            **{
                "create.return_value": mock_client,
                "events.get_page.side_effect": ApiException(err_msg)
            }
        )

        with pytest.raises(ApiException) as err:
            get_clicked_events()
            assert err_msg == err.value

Затем при запуске из корня репозитория вы увидите, что оба теста прошли.

platform darwin -- Python 3.8.9, pytest-7.0.1, pluggy-1.0.0
cachedir: .pytest_cache
rootdir: ***
plugins: mock-3.7.0
collected 2 items                                                                                                                                   

tests/test_script.py::test_get_clicked_events_success PASSED                                                                                  [ 50%]
tests/test_script.py::test_get_clicked_events_fail PASSED                                                                                     [100%]

=========================================================== 2 passed============================================================
Вернуться на верх