Как подражать ответу инстанцированного подражаемого объекта с помощью python pytest
Я пытаюсь высмеять функцию, которая вызывает API sendgrid. Я хочу высмеять библиотеку API, но не могу понять, где я ошибаюсь.
Функция, которая вызывает API:
def mailing_list_signup(data: dict):
email_address = data["email"]
name = data["contact_name"]
API_KEY = settings.SENDGRID_API_KEY
sg = SendGridAPIClient(API_KEY)
# https://docs.sendgrid.com/api-reference/contacts/add-or-update-a-contact
data = {
"contacts": [
{
"email": email_address,
"name": name,
}
]
}
response = sg.client.marketing.contacts.put(request_body=data)
return response
мой плохой тест:
@dataclass
class APIResponse:
status_code: int = 202
body: bytes = b"example"
@override_settings(SENDGRID_API_KEY='123')
def test_mailing_list_signup():
response = APIResponse()
with mock.patch("myapp.apps.base.business.SendGridAPIClient") as sendgridAPI:
sendgridAPI.client.marketing.contacts.put.return_value = response
data = {
"email": "name@example.com",
"contact_name": None,
}
result = mailing_list_signup(data)
assert result == response
Pytest сообщает мне о неудаче теста со следующим сообщением:
FAILED myapp/apps/base/tests/test_business.py::test_mailing_list_signup - AssertionError: assert <MagicMock name='SendGridAPIClient().client.marketing.contacts.put()' id='4622453344'> == APIClient(status_code=202, body=b'example')
Поскольку возвратное значение вызываемой переменной подвергается имитации, возвратное значение должно быть установлено на вызываемой переменной, а не на атрибуте.
изменение
sendgridAPI.client.marketing.contacts.put.return_value = response
на
sendgridAPI.client.marketing.contacts.put().return_value = response