是否可以为某些测试禁用 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 来使用一个什么都不做的假人。但我现在已经尝试了 BaseSignalProcessorSimpleEngine,我仍然可以看到我们的搜索索引 (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 所以如果你有一个繁忙的站点那么我的条件检查不会 当它是 运行宁直播