Макетный вызов API в модели сигнала Django

Я новичок в Django и модульных тестах, поэтому любые отзывы будут очень полезны.

Я создал небольшую интеграцию с третьей стороной для создания соответствующего аккаунта в их системе всякий раз, когда аккаунт создается в нашей системе. Я делаю это по сигналу в классе модели. Сигнал прост и выглядит следующим образом:

@receiver(post_save, sender=Company)
def create_integration_company(sender, instance, created, **kwargs):
    if created:
        company_integration_id = third_party.create_crm_company(instance)
        instance.integration_id = company_integration_id
        instance.save()

Когда я запустил наши тесты, они создали тысячи учетных записей в системе этой третьей стороны, поэтому я обнаружил mock.

У нас есть куча тестов, которые создают компании, и мне интересно, нужно ли добавлять это в каждый из них? @mock.patch("apps.accounts.utils.build_request", return_value="123")

Мой вопрос: на каком уровне я должен издеваться над ответом и просто возвращать 123 для нового идентификатора интеграции? Могу ли я сделать это на уровне модели? Или я должен сделать это для каждого тестового случая, который у нас есть?

Мокинг будет работать, но лучшим вариантом будет отключение сигналов для модульных тестов. О том, как отключить сигнал, смотрите https://docs.djangoproject.com/en/4.0/topics/signals/#disconnecting-signals. Вы можете создать миксин, предназначенный только для тестов, который вы можете включить в свой набор тестов. В идеале это можно сделать в init или setUpClass миксина. Скажем, миксин будет SignalDisconnector, который вы будете использовать как:

class TestSuite(TestCase, SignalDisconnector)

Это позволит проверить только то поведение, которое вы планируете в тестовом наборе, не испытывая никаких побочных эффектов.

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