所以我有各种跨应用程序发送的信号和处理程序。但是,当我执行测试/进入“测试模式”时,我希望禁用这些处理程序。
在测试模式下是否有特定于 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/