Как подражать ответу инстанцированного подражаемого объекта с помощью 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

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