【问题标题】:Mock API call in model signal Django模型信号Django中的模拟API调用
【发布时间】:2022-01-17 11:35:43
【问题描述】:

我是 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 以获得新的集成 ID?我可以在模型级别做吗?还是我必须为我们拥有的每个测试用例都这样做?

【问题讨论】:

    标签: python django unit-testing mocking


    【解决方案1】:

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

    class TestSuite(TestCase, SignalDisconnector)
    

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

    【讨论】:

    • 好的,有道理。谢谢! dispatch_uid 可以在语句中硬编码以将接收器连接到信号,即@receiver(post_save, sender=Company, dispatch_uid='my_unique_uid'),还是必须动态分配该值?只发送了多个 post_save 信号,我只想忽略我的,所以我想知道我是否可以使用该 dispatch_uid @Syed Muhammad Dawoud Sheraz Al 断开我的信号
    • 可以硬编码 dispatch_uid。 uid 在各种接收器中应该是唯一的,因为它有助于在连接/断开信号处理程序时识别正确的接收器。参考:-docs.djangoproject.com/en/4.0/topics/signals/…-docs.djangoproject.com/en/4.0/topics/signals/…
    • 好的,但这很容易断开它,因为我可以调用Signal.disconnect(post_save, dispatch_uid="my_unique_uid"),然后这意味着该特定信号将被断开。我可以在需要它的测试文件中将它添加到我的 setUp 函数中,对吗?
    • 是的。这仅适用于您的测试环境/CI。我建议的一件事是,如果您在 setUp 中断开信号,请在 tearDown 中将其重新连接。我找不到确切的参考,但有时一个测试套件中的这种断开连接会影响其他测试套件的执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 2017-03-20
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多