Как высмеять ответ от библиотечного 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============================================================