在Django Factory Boy中,是否可以静音特定的接收器(并非所有信号)?

时间:2018-08-15 21:46:35

标签: python django factory-boy

在我们的Django项目中,我们有一个post_save模型发送的User信号的接收器函数:

@receiver(post_save, sender=User)
def update_intercom_attributes(sender, instance, **kwargs):
    # if the user is not yet in the app, do not attempt to setup/update their Intercom profile.
    if instance.using_app:
        intercom.update_intercom_attributes(instance)

该接收器调用了一个外部API,我们希望在使用factory_boy生成测试装置时将其禁用。据我从https://factoryboy.readthedocs.io/en/latest/orms.html#disabling-signals得知,所有可以做的就是使 all post_save信号静音,而不是特定的接收器。

目前,我们要解决的方法是定义一个IntercomMixin,每个测试用例都从中继承(在继承链的第一个位置):

from unittest.mock import patch

class IntercomMixin:
    @classmethod
    def setUpClass(cls):
        cls.patcher = patch('lucy_web.lib.intercom.update_intercom_attributes')
        cls.intercomMock = cls.patcher.start()
        super().setUpClass()

    @classmethod
    def tearDownClass(cls):
        super().tearDownClass()
        cls.patcher.stop()

但是,将这种mixin添加到每个测试用例中既繁琐又重复,理想情况下,我们希望将此修补功能构建到测试工厂本身中。

在Factory Boy中有什么方法可以做到这一点? (我查看了源代码(https://github.com/FactoryBoy/factory_boy/blob/2d735767b7f3e1f9adfc3f14c28eeef7acbf6e5a/factory/django.py#L256),似乎__enter__方法正在设置signal.receivers = [];也许可以对其进行修改,使其接受receiver函数并将其弹出signal.receivers列表之外)?

0 个答案:

没有答案