编程语言
首页 > 编程语言> > python – Django haystack测试

python – Django haystack测试

作者:互联网

我试图测试我的搜索视图正确地从我的搜索中呈现结果,但是,搜索使用我的实时数据库中的索引而不是我的测试数据库,所以当我为我的测试用例创建一些对象时,它们没有反映在搜索页面.

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

谷歌搜索时我似乎只能找到这篇文章:http://reliablybroken.com/b/2012/12/testing-django-haystack-whoosh/
它不适用于当前版本.

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

解决方法:

我在我们的项目中遇到过类似的用例.这是我们实施的粗略概念.请注意,如果您使用simple_backend(SB),您的一些自定义过滤器/准备方法may not work as expected.因此,即使在测试模式下,建议使用非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)

标签:python,django,testing,django-haystack
来源: https://codeday.me/bug/20190708/1399445.html