使用本地设置进行django测试

时间:2011-08-26 16:58:13

标签: python 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设置已正确设置(其中只有'我' )。有什么想法会发生这种情况吗?以下是<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,这样无论是在本地还是在生产中运行,测试都会通过。

有什么想法吗?

3 个答案:

答案 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)

我记得读过你不应该在运行时以任何方式更改设置值,这会导致问题。