在测试中修改Django设置

时间:2017-12-31 11:40:07

标签: python django testing django-settings

来自Django docs

  

您不应在运行时更改应用程序中的设置。对于   例如,不要在视图中执行此操作:

from django.conf import settings

settings.DEBUG = True   # Don't do this!
     

您应该为设置分配的唯一位置是设置文件。

我注意到Django测试代码does会改变设置。为什么可以在那里做到?

2 个答案:

答案 0 :(得分:1)

可以更改设置吗?

简短回答 : 不,除非你在创业期间这样做。

长答案 : Django文档是正确的,您不应该在运行时修改设置。这意味着,应用启动后无需修改设置,例如更改views.pyserializers.pymodels.py或您在开发过程中添加的其他模块中的配置。但如果你在启动时这样做依赖于局部变量就可以修改设置,并且你完全了解会发生什么。

您可以在测试时修改设置吗?

是的,如果你认为你需要它。您可以在单元测试中依赖override_settings更改设置值以进行测试,请参阅使用示例here。 此外,此装饰器所做的一切 - 覆盖了提供的值的设置,并在测试通过后恢复设置值(执行修饰函数)。

为什么Django会在测试代码时修改它们。

从我看到的情况来看,他们仅为测试目的更改设置,他们唯一做的事情是 - 将本地主机添加到允许的主机,以便他们可以使用本地域测试代码。像这样的例子对我来说似乎很合理,因为改变只进行一次并且在单元测试设置期间。想象一下,每次都有overrride_settings电话,这将是滔天看。

一般建议。

尽量不要,没有必要修改设置,如果有 - 想一想,也许设置不适合可变设置? 如果你想在运行时修改设置 - 请注意,设置可能会被缓存到某个地方,复制和访问所有地方 - 这是一个充足的空间来容纳新的错误。除了由于修改后的设置的旧/新值而导致系统出现意外行为外,没有什么不好的。

希望这是有道理的。

答案 1 :(得分:0)

答案如下:

  

您不应在运行时更改应用程序中的设置。

单元测试代码不是您的应用程序的一部分,因此该声明不适用于单元测试。

  

为什么可以在那做?

如上所述,如果您以本地方式进行设置(因为有时以多线程方式运行测试),则可以在测试过程中覆盖设置。

这是他们推荐这样做的方式:

from django.test import TestCase

class LoginTestCase(TestCase):

    def test_login(self):

         # First check for the default behavior
         response = self.client.get('/sekrit/')
         self.assertRedirects(response, '/accounts/login/?next=/sekrit/')

         # Then override the LOGIN_URL setting
         with self.settings(LOGIN_URL='/other/login/'):
             response = self.client.get('/sekrit/')
             self.assertRedirects(response, '/other/login/?next=/sekrit/')

查看文档: https://docs.djangoproject.com/en/2.2/topics/testing/tools/#django.test.SimpleTestCase.settings