是否可以为某些测试禁用django haystack?

是否可以为某些测试禁用django haystack?,django,unit-testing,django-haystack,Django,Unit Testing,Django Haystack,我们使用它作为搜索索引。通常很好,但在测试期间,它会为每个模型对象的创建和保存增加开销,而对于大多数测试来说,它不是必需的。所以我想避免它。所以我想我会用一个什么都不做的假人。但是我现在已经尝试了BaseSignalProcessor和SimpleEngine,我仍然可以看到我们的搜索索引(elasticsearch)受到了很多攻击 我尝试过的两个版本是: 首先使用不进行数据准备的: from django.test import TestCase from django.test.utils

我们使用它作为搜索索引。通常很好,但在测试期间,它会为每个模型对象的创建和保存增加开销,而对于大多数测试来说,它不是必需的。所以我想避免它。所以我想我会用一个什么都不做的假人。但是我现在已经尝试了
BaseSignalProcessor
SimpleEngine
,我仍然可以看到我们的搜索索引(elasticsearch)受到了很多攻击

我尝试过的两个版本是:

首先使用不进行数据准备的:

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):
    # ...
然后使用,这意味着要保存的信号没有连接:

from django.test import TestCase
from django.test.utils import override_settings

@override_settings(HAYSTACK_SIGNAL_PROCESSOR='haystack.signals.BaseSignalProcessor')
class TestAllTheThings(TestCase):
    # ...
我正在使用pytest作为重要的测试运行程序

你知道我是否遗漏了什么吗?

设置会在事实发生后覆盖它,不会改变任何东西

相反,您可以对信号处理器进行子类化,并加入一些逻辑,从而有条件地禁用它,如下所示:

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
对于要启用它的少数测试,请使用
覆盖设置()
,就像您已经尝试过的那样:

class MyTest(TestCase):
    @override_settings(HAYSTACK_ENABLE=True)
    def that_one_test_where_its_needed(self):
       pass

当然,您可以更进一步,为signal processor类设置条件设置,因此,如果您有一个繁忙的站点,那么我的条件检查在它运行时不会生效。

对于您尝试的第一部分,您是否在TestAllThings的设置中调用了haystack.connections.reload('default')?