是否可以为某些测试禁用 django haystack?
Is it possible to disable django haystack for some tests?
我们使用 django-haystack as our search index. Generally great, but during tests it adds overhead to every model object creation and save, and for most tests it is not required. So I would like to avoid it. So I thought I'd use 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 作为测试运行程序以防万一。
知道我是否遗漏了什么吗?
设置是 only accessed once,所以事后覆盖它不会改变任何东西。
相反,您可以子class信号处理器并坚持一些逻辑以有条件地禁用它,如下所示:
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
而不是自定义 运行ner,则可以使用环境变量设置设置键。否则你应该知道把它贴在哪里。
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
当然你可以更进一步,对信号处理器进行条件设置 class 所以如果你有一个繁忙的站点那么我的条件检查不会 当它是 运行宁直播
我们使用 django-haystack as our search index. Generally great, but during tests it adds overhead to every model object creation and save, and for most tests it is not required. So I would like to avoid it. So I thought I'd use 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 作为测试运行程序以防万一。
知道我是否遗漏了什么吗?
设置是 only accessed once,所以事后覆盖它不会改变任何东西。
相反,您可以子class信号处理器并坚持一些逻辑以有条件地禁用它,如下所示:
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
而不是自定义 运行ner,则可以使用环境变量设置设置键。否则你应该知道把它贴在哪里。
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
当然你可以更进一步,对信号处理器进行条件设置 class 所以如果你有一个繁忙的站点那么我的条件检查不会