Python 2.7 Django 1.2
当我测试Django应用程序时,我得到奇怪的local_settings行为。我的<project>/settings.py
设置如下:
DEBUG = False
TEMPLATE_DEBUG = DEBUG
ADMINS = (
("Me", "me@me.com"),
)
MANAGERS = ADMINS + (('Person1', 'person1@blah.com'),)
# ... rest of settings
try:
from local_settings import *
except ImportError:
pass
并在<project>/local_settings.py
我有:
DEBUG = True
MANAGERS = (
('Me', 'me@me.com'),
)
因此,在本地工作时,MANAGERS
设置应为(('Me', 'me@me.com'),)
,DEBUG
应设为True
。
但是,在我的某个应用的测试中,我正在测试settings.DEBUG
并获取False
,但MANAGERS
设置已正确设置(其中只有'我' )。有什么想法会发生这种情况吗?以下是<project>/<app>/tests.py
文件的相关部分:
from django.conf import settings
from django.test import TestCase
# ...
class MyTests(TestCase):
def mytest(self):
if settings.DEBUG:
self.assertEqual(settings.MANAGERS, (('Me', 'me@me.com'),))
else:
self.assertEqual(settings.MANAGERS, (('Me', 'me@me.com'), ('Person1', 'person1@blah.com')))
结果是
AssertionError: (('Me', 'me@me.com'),) != (('Me', 'me@me.com'), ('Person1', 'person1@blah.com'))
因为else
设置不正确,所以看起来它正在测试settings.DEBUG
分支,然后自AssertionError
设置正确以来提升settings.MANAGERS
。
如果我运行python manage.py shell
我就明白了:
>>> from django.conf import settings
>>> settings.DEBUG
True
>>> settings.MANAGERS
(('Me', 'me@me.com'),)
所以他们在那里设置正确。
我知道我可以在我的测试中手动覆盖设置,但我想尝试使用settings.DEBUG
,这样无论是在本地还是在生产中运行,测试都会通过。
有什么想法吗?
答案 0 :(得分:5)
这是Django中的一个有意选择:
无论配置文件中DEBUG设置的值如何,所有Django测试都以DEBUG = False运行。这是为了确保您观察到的代码输出与生产设置中的输出相匹配。
参考:https://docs.djangoproject.com/en/dev/topics/testing/#other-test-conditions
答案 1 :(得分:2)
运行测试时使用--settings
选项
python manage.py test --settings=mysite.settings_local
答案 2 :(得分:1)
我记得读过你不应该在运行时以任何方式更改设置值,这会导致问题。