Python Django干草堆试验

Python Django干草堆试验,python,django,testing,django-haystack,Python,Django,Testing,Django Haystack,我正在尝试测试我的搜索视图是否正确呈现搜索结果,但是,搜索使用的是来自实时数据库而不是测试数据库的索引,因此当我为测试用例创建一些对象时,它们不会反映在搜索页面上 我如何让haystack使用搜索数据库的索引,或者更好的是,只是假装它,不使用索引,而是按原样使用数据库。这对于那个测试用例来说是很好的,而且可能更快 我似乎只有在谷歌搜索时才能找到这篇文章: 而且它不适用于当前版本 Pip versions: django==1.7.5 django-haystack==2.4.0 创建一个测试索

我正在尝试测试我的搜索视图是否正确呈现搜索结果,但是,搜索使用的是来自实时数据库而不是测试数据库的索引,因此当我为测试用例创建一些对象时,它们不会反映在搜索页面上

我如何让haystack使用搜索数据库的索引,或者更好的是,只是假装它,不使用索引,而是按原样使用数据库。这对于那个测试用例来说是很好的,而且可能更快

我似乎只有在谷歌搜索时才能找到这篇文章: 而且它不适用于当前版本

Pip versions:
django==1.7.5
django-haystack==2.4.0

创建一个测试索引,并确保haystack配置在测试模式下指向测试索引。 类似于:如果sys.argv中的“test”:

除此之外,您可以在搜索引擎中添加另一个索引,也可以使用另一个搜索引擎(如whoosh)进行测试


另一个选项是模拟从搜索引擎得到的响应,并将其传递给您尝试测试的视图/表单。

我在我们的项目中遇到了类似的用例。下面是我们实现的大致思路。请注意,如果使用
simple\u backend
(SB),则会使用一些自定义筛选器/准备方法。因此,即使在测试模式下,也建议使用非SB后端(例如
弹性搜索

from django.core.urlresolvers import reverse
from django.test import TestCase
from django.test.utils import override_settings

from haystack import connections
from haystack.utils.loading import ConnectionHandler, UnifiedIndex

from myapp.models import MyModel
from myapp.search_indexes import MyModelIndex


TEST_INDEX = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://127.0.0.1:9200/',
        'INDEX_NAME': 'test_index',
    },
}


@override_settings(HAYSTACK_CONNECTIONS=TEST_INDEX )
class SearchViewTest(TestCase):
    def setUp(self):
        """
        Some ideas taken from here:
        https://github.com/django-haystack/django-haystack/blob/v2.6.0/test_haystack/test_views.py#L40
        """
        connections = ConnectionHandler(TEST_INDEX )
        super(SearchViewTest, self).setUp()

        self.mm = MyModel.objects.create(name='Dummy Title')

        # Stow.
        self.old_unified_index = connections['default']._index
        self.ui = UnifiedIndex()
        self.mmi = MyModelIndex()
        self.ui.build(indexes=[self.mmi])
        connections['default']._index = self.ui

        # Update the 'index'.
        backend = connections['default'].get_backend() 
        backend.clear()
        backend.update(self.mmi, MyModel.objects.all())

    def tearDown(self):
        connections['default']._index = self.old_unified_index
        super(SearchViewTest, self).tearDown()

    def test_search_results(self):
        response = self.client.get('/search?q=dummy')
        self.assertIn(self.mm.name, response)

我已经在使用whoosh作为引擎,所以我不依赖任何我想模仿的外部运行服务。因此,创建一个测试索引将是解决方案。怎么办?我在任何地方都找不到它。通常,我会执行
/manage.py update\u index
,但这会破坏实时索引。因此,我需要修改测试中的设置,以便将该索引放在其他位置;不使用live索引?