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

Ham*_*ner 7 django unit-testing django-haystack

我们使用django-haystack作为搜索索引.通常很棒,但在测试期间,它会增加每个模型对象创建和保存的开销,并且对于大多数测试来说,它不是必需的.所以我想避免它.所以我想我会使用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):
    # ...
Run Code Online (Sandbox Code Playgroud)

然后使用BaseSignalProcessor,这意味着要保存的信号没有连接起来:

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

@override_settings(HAYSTACK_SIGNAL_PROCESSOR='haystack.signals.BaseSignalProcessor')
class TestAllTheThings(TestCase):
    # ...
Run Code Online (Sandbox Code Playgroud)

我正在使用pytest作为测试运行器以防万一.

知道我有什么遗失的吗?

Ano*_*ous 5

这些设置只能访问一次,因此事后覆盖它不会改变任何内容。

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

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)
Run Code Online (Sandbox Code Playgroud)

现在,如果您将其配置为信号处理器,那么您可以在测试中轻松禁用它。manage.py test如果您只是使用而不是自定义运行器,则可以使用环境变量设置设置键。否则你应该知道该把它粘在哪里。

import os

HAYSTACK_DISABLE = 'IS_TEST' in os.environ
Run Code Online (Sandbox Code Playgroud)

并运行它

IS_TEST=1 python manage.py test
Run Code Online (Sandbox Code Playgroud)

对于您希望启用它的少数测试,请override_settings()像您已经尝试过的那样使用:

class MyTest(TestCase):
    @override_settings(HAYSTACK_ENABLE=True)
    def that_one_test_where_its_needed(self):
       pass
Run Code Online (Sandbox Code Playgroud)

当然,您可以更进一步,对信号处理器类进行条件设置,因此如果您有一个繁忙的站点,那么我的条件检查在实时运行时不会减慢它的速度。