django - 想要在 Django 测试中禁用信号

标签 django django-testing django-signals

所以我有各种跨应用程序发送的信号和处理程序。但是,当我执行测试/进入“测试模式”时,我希望禁用这些处理程序。

在测试模式下是否有特定于 Django 的禁用信号/处理程序的方法?我可以想到一个非常简单的方法(在 if TESTING 子句中包含处理程序)但我想知道是否有更好的方法内置到 Django 中?...

最佳答案

我在寻找禁用一组测试用例的信号时发现了这个问题,Germano 的回答引导我找到了解决方案,但它采用了相反的方法,所以我想我应该添加它。

在你的测试类中:

class MyTest(TestCase):
    def setUp(self):
        # do some setup
        signals.disconnect(listener, sender=FooModel)

我没有在添加信号时添加决策代码,而是在测试时禁用它,这对我来说是一个更好的解决方案(因为测试应该围绕代码而不是围绕测试编写代码)。希望对同船的人有用!

编辑:自从写这篇文章以来,我被介绍了另一种禁用测试信号的方法。这需要 factory_boy包 (v2.4.0+) 这对于简化 Django 中的测试非常有用。你真的被宠坏了:

import factory
from django.db.models import signals

class MyTest(TestCase):
    @factory.django.mute_signals(signals.pre_save, signals.post_save)
    def test_something(self):

警告感谢 ups:它会在工厂内部和创建对象时使信号静音,但当您想进行显式 save() 时不会进一步在内部测试 - 信号将在那里取消静音。如果这是一个问题,那么在 setUp 中使用简单的断开连接可能是可行的方法。

关于django - 想要在 Django 测试中禁用信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18532539/

相关文章:

python - Django self.cleaned_data 问题。

python - 如何检查 Django 应用程序的性能?

django - Django channel 单元测试的虚假数据

python - learning_record_recorddinningroom.room_id 不能为 NULL

python - Django 信号与 channel

Django:将变量从pre_save传递到post_save信号

python - 在 ReportLab 生成的 PDF 中包含 base64 编码的图像

python - 从 QueryDict 中提取项目

django - 在编写 Django 测试用例时访问带注释的查询集

python - Django 测试 - 在所有测试中修补对象