Макетный вызов 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)
Это позволит проверить только то поведение, которое вы планируете в тестовом наборе, не испытывая никаких побочных эффектов.