我们使用django-haystack作为搜索索引。通常很棒,但在测试期间,它会增加每个模型对象创建和保存的开销,并且对于大多数测试来说,它不是必需的。所以我想避免它。所以我以为我会用override_settings来使用一个什么都不做的假人。但我现在尝试了BaseSignalProcessor
和SimpleEngine
,我仍然可以看到我们的搜索索引(elasticsearch)受到了很大的影响。
我试过的两个版本是:
首先使用没有数据准备的SimpleEngine:
from django.test import TestCase
from django.test.utils import override_settings
HAYSTACK_DUMMY_INDEX = {
'default': {
'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',
}
}
@override_settings(HAYSTACK_CONNECTIONS=HAYSTACK_DUMMY_INDEX)
class TestAllTheThings(TestCase):
# ...
然后使用BaseSignalProcessor,这意味着要保存的信号没有连接起来:
from django.test import TestCase
from django.test.utils import override_settings
@override_settings(HAYSTACK_SIGNAL_PROCESSOR='haystack.signals.BaseSignalProcessor')
class TestAllTheThings(TestCase):
# ...
我正在使用pytest作为测试运行器,以防万一。
知道我有什么遗失的吗?
答案 0 :(得分:1)
设置为only accessed once,因此在事实不变之前将其覆盖。
相反,您可以将信号处理器子类化,并遵循某种逻辑来有条件地禁用它,如下所示:
from django.conf import settings
from haystack.signals import BaseSignalProcessor
class TogglableSignalProcessor(BaseSignalProcessor):
settings_key = 'HAYSTACK_DISABLE'
def handle_save(self, sender, instance, **kwargs):
if not getattr(settings, self.settings_key, False):
super().handle_save(sender, instance, **kwargs)
def handle_delete(self, sender, instance, **kwargs):
if not getattr(settings, self.settings_key, False):
super().handle_delete(sender, instance, **kwargs)
现在,如果将其配置为信号处理器,则可以在测试中轻松禁用它。如果您仅使用manage.py test
而非自定义运行器,则可以使用环境变量来设置设置键。否则,您应该知道将其粘贴在哪里。
import os
HAYSTACK_DISABLE = 'IS_TEST' in os.environ
并运行它
IS_TEST=1 python manage.py test
对于要启用它的一些测试,请像尝试过的那样使用override_settings()
:
class MyTest(TestCase):
@override_settings(HAYSTACK_ENABLE=True)
def that_one_test_where_its_needed(self):
pass
当然,您可以走得更远,并为信号处理器类提供条件设置,因此,如果您的站点繁忙,那么我的条件检查就不会slow it down运行了。