在我们的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
列表之外)?