【问题标题】:Django haystack testingDjango 干草堆测试
【发布时间】:2015-08-04 07:12:28
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python django testing django-haystack


    【解决方案1】:

    我在我们的项目中遇到过类似的用例。这是我们实现的粗略想法。请注意,如果您使用simple_backend (SB),您的一些自定义过滤器/准备方法may not work as expected。因此,即使在测试模式下,也建议使用非 SB 后端(例如 Elastic Search)。

    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)
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我已经在使用 whoosh 作为引擎,所以我不依赖任何我想模拟的外部运行服务。因此,创建一个测试索引将是解决方案。怎么样?我找不到任何地方提到它。通常,我会使用./manage.py update_index,但这会破坏实时索引。所以我需要从测试中修改我的设置,以便将该索引放在其他地方;不考虑实时索引?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 2011-05-03
      相关资源
      最近更新 更多