2017-09-28 34 views
2

在我的Django项目的URL配置我有这样的事情:在测试过程中,如何覆盖urlconf中使用的Django设置?

from django.conf import settings 
from django.conf.urls import include, url 

urlpatterns = [ 
    url(r'^{}/blog'.format(settings.MY_ROOT_DIR), 
     include('weblogs.urls')), 
    # ... 
] 

在我settings.py,我会碰到这样的:

MY_ROOT_DIR = 'phil' 

这让我可以设置的根目录,在的二手几个地方,在一个地方(设置)。

当我来到测试网址,我用的是@override_settings decorator

from django.test import TestCase, override_settings 
from django.urls import reverse 

@override_settings(MY_ROOT_DIR='terry') 
class WeblogUrlsTestCase(TestCase): 

     def test_post_detail_url(self): 
      self.assertEqual(
       reverse('post_detail', kwargs={'slug': 'my-post'}), 
       '/terry/blog/my-post/' 
      ) 

然而,@override_settings似乎并没有做任何事情 - 在urls.py使用的MY_ROOT_DIR值始终"phil",从来没有的"terry"重写的设置。我也尝试过@modify_settings,并在测试方法上使用它,而不是类。

我想urlconf是由Django加载之前@override_settings生效?有没有解决的办法?或者更好的解决方案?

回答

2

正如你所猜测的,你已经在URL中导入后覆盖了设置。如果你在某种方法中使用了settings变量,而不是在urls.py的全局范围内,这可能会奏效。

尽管在运行时重写设置配置看起来很方便,但在我看来,您应该创建一个单独的文件进行测试。这为测试节省了大量配置,这将确保您永远不会做不可逆转的事情(如清理临时数据库)。

# test_settings.py 

MY_ROOT_DIR = 'terry' 

说你的测试文件 'MY_PROJECT/test_settings.py' 存在,在你的manage.py添加

settings = 'my_project.test_settings' if 'test' in sys.argv else 'my_project.settings' 

。这将确保您在运行python manage.py test时仅使用test_settings。如果你正在使用pytest等其他测试客户端,你可以轻松地将其添加到pytest.ini

+0

啊,当然。我已经有一个单独的设置文件进行测试,但由于某种原因没有想到使用它!我的大脑今天一定很累:)谢谢! –

+0

@PhilGyford请标记为正确答案,如果它帮助:) – hspandher

+0

我不得不再等五分钟才能让我! –

相关问题