Mock API call in model signal Django

I am new to Django and unit tests, so any feedback is very helpful.

I built a small integration with a third party to create a matching account in their system whenever an account is created in our system. I do this on a signal in the model class. The signal is simple and looks like this:

@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()

When I ran our tests, it created thousands of accounts in this third party's system, so I discovered mock.

We have a bunch of tests that create companies and I was wondering if I have to add this to every one of them? @mock.patch("apps.accounts.utils.build_request", return_value="123")

My question is: at which level should I mock the response and just return 123 for the new integration id? Can I do it at the model level? Or do I have to do this for every test case we have?

Mocking will work but the better option would be to disconnect the signals for the unit tests. Please see https://docs.djangoproject.com/en/4.0/topics/signals/#disconnecting-signals on how to disconnect signal. You can create a test-only mixin which you can include in your test suite. Ideally, you can do this in mixin's init or setUpClass. Say the mixin is SignalDisconnector, which you will use as:

class TestSuite(TestCase, SignalDisconnector)

This will only test the behavior which you are intending in the test suite without experiencing any side effects.

Back to Top