我有一个通过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做事情会更好。
有更好的想法吗?有类似问题的人?
答案 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)