在django中更改测试的设置(干草堆的搜索引擎是特定的)

时间:2011-11-23 05:44:56

标签: django settings django-haystack

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我从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)