使用本地设置进行Django测试


问题内容

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设置设置正确(其中仅包含“
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'))

因此,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以便无论是在本地运行还是在生产中运行测试都可以通过。

有任何想法吗?


问题答案:

这是Django中的故意选择:

无论配置文件中DEBUG设置的值如何,所有Django测试都将以DEBUG = False运行。这是为了确保观察到的代码输出与生产设置中看到的输出匹配。

参考:https : //docs.djangoproject.com/en/dev/topics/testing/#other-test-
conditions