【问题标题】:Changing settings for the tests in django (search engine for haystack to be specific)更改 django 中的测试设置(具体的 haystack 搜索引擎)
【发布时间】:2012-01-04 11:40:24
【问题描述】:

我有一个通过 django-haystack 使用 SOLR 搜索引擎的项目。搜索引擎位于不同的实时服务器上,并且在测试运行期间触摸它是不可取的(实际上,这是不可能的,因为对该主机的访问被防火墙了)

我正在使用标准的 django 测试运行程序。幸运的是,它为我提供了我可以根据自己的喜好修改的对象测试设置,但事实证明这并不是故事的结局。

django-haystack 中的很多东西都是在导入时实例化的,所以当我在测试运行程序中更改测试设置时为时已晚,尽管我将 SEARCH_BACKEND 更改为虚拟,但测试仍然打电话给SOLR。该问题并非特定于 HAYSTACK - mongoengine 也会出现同样的问题。任何类级别的语句(例如 CharField(default=Blah.objects.find(...)))都会在 django 有机会更改设置之前的实例化时间执行。

当然,问题的根源在于 Django 设置是一个可怕的全局可变混乱,并且 Django 没有为实例化代码提供集中位置。鉴于此,对于最简单的测试解决方案有什么建议吗?目前我正在考虑一个 shell 脚本,它将 DJANGO_SETTINGS 环境变量更改为 test_settings 并在之后运行 ./manage.py 测试。如果我仍然可以通过 ./manage.py 做事,那就更好了。

有更好的想法吗?有类似问题的人?

【问题讨论】:

标签: django settings django-haystack


【解决方案1】:

我从here 那里得到答案并稍作修改。这对我很有用:

from contextlib import contextmanager

@contextmanager
def connection(**kwargs):
    from haystack import connections

    for key, new_value in kwargs.items():
        setattr(connections, key, new_value)
        connections['default'].options['URL'] = connections.connections_info['default']['URL']
    yield

然后,我的测试看起来像:

def test_job_detail_by_title_slug_job_id(self):
    with connection(connections_info=solr_settings.HAYSTACK_CONNECTIONS):
        resp = self.client.get('/0/rts-crb-unix-production-engineer/27216666/job/')
        self.assertEqual(resp.status_code, 404)
        resp = self.client.get('/indianapolis/indiana/usa/jobs/')
        self.assertEqual(resp.status_code, 200)

【讨论】:

  • 我做了一个猴子补丁,它也可以在 haystack 连接中使用猴子补丁,因为覆盖设置来得太晚 haystack.connections = haystack.loading.ConnectionHandler(HAYSTACK_CONNECTIONS)
猜你喜欢
  • 2012-03-21
  • 2011-03-10
  • 2023-03-06
  • 1970-01-01
  • 2011-05-20
  • 2015-02-24
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多