使用本地设置进行Django测试

3 投票
3 回答
3477 浏览
提问于 2025-04-17 00:25

我在测试一个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

撰写回答