使用本地设置进行Django测试
我在测试一个Django应用时,发现本地设置的行为有点奇怪。我把我的<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
的设置是正确的(里面确实有'Me')。你知道为什么会这样吗?以下是<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'))
看起来是因为settings.DEBUG
设置不正确,所以测试走了else
的分支,然后因为settings.MANAGERS
设置正确而抛出了AssertionError
。
如果我运行python manage.py shell
,我得到的是:
>>> from django.conf import settings
>>> settings.DEBUG
True
>>> settings.MANAGERS
(('Me', 'me@me.com'),)
所以在这里它们设置是正确的。
我知道我可以在测试中手动覆盖设置,但我想尝试使用settings.DEBUG
,这样无论是在本地还是在生产环境中运行,测试都能通过。
你有什么想法吗?
3 个回答
1
我记得有读到过,运行时不应该以任何方式更改设置的值,这样会引发问题。
3
在运行测试时,使用 --settings
这个选项。
python manage.py test --settings=mysite.settings_local
10
这是Django中的一个故意选择:
无论你在配置文件中设置的DEBUG值是什么,所有Django的测试都会在DEBUG=False的情况下运行。这是为了确保你代码的输出结果和在实际生产环境中看到的结果一致。
参考链接: https://docs.djangoproject.com/en/dev/topics/testing/#other-test-conditions