在模型信号 Django 中模拟 API 调用

Mock API call in model signal Django

我是 Django 和单元测试的新手,所以任何反馈都非常有帮助。

我与第三方建立了一个小型集成,每当在我们的系统中创建一个帐户时,我就会在他们的系统中创建一个匹配的帐户。我对模型 class 中的信号执行此操作。信号很简单,看起来像这样:

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

我的问题是:我应该在哪个级别模拟响应并且只为新集成 ID return 123?我可以在模型级别进行吗?还是我必须为我们拥有的每个测试用例都执行此操作?

模拟会起作用,但更好的选择是断开单元测试的信号。请参阅 https://docs.djangoproject.com/en/4.0/topics/signals/#disconnecting-signals 了解如何断开信号。您可以创建一个仅用于测试的 mixin,您可以将其包含在您的测试套件中。理想情况下,您可以在 mixin 的 init 或 setUpClass 中执行此操作。假设 mixin 是 SignalDisconnector,您将使用它作为:

class TestSuite(TestCase, SignalDisconnector)

这只会测试您在测试套件中想要的行为,而不会遇到任何副作用。