gpt4 book ai didi

django - 更改 django 中测试的设置(具体为 haystack 搜索引擎)

转载 作者:行者123 更新时间:2023-12-02 06:55:04 25 4
gpt4 key购买 nike

我有一个通过 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 做事情,那就更好了。

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

最佳答案

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

关于django - 更改 django 中测试的设置(具体为 haystack 搜索引擎),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8237807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com