2011-08-26 147 views
1

的Python 2.7 的Django 1.2Django的测试

我正奇怪LOCAL_SETTINGS行为,当我测试一个Django应用程序。我有我的<project>/settings.py设置是这样的:

DEBUG = False 
TEMPLATE_DEBUG = DEBUG 

ADMINS = (
     ("Me", "[email protected]"), 
) 

MANAGERS = ADMINS + (('Person1', '[email protected]'),) 

# ... rest of settings 

try: 
    from local_settings import * 
except ImportError: 
    pass 

<project>/local_settings.py我:

DEBUG = True 

MANAGERS = (
     ('Me', '[email protected]'), 
) 

所以,虽然在本地工作,该MANAGERS设置应(('Me', '[email protected]'),)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', '[email protected]'),)) 
     else: 
      self.assertEqual(settings.MANAGERS, (('Me', '[email protected]'), ('Person1', '[email protected]'))) 

结果是

AssertionError: (('Me', '[email protected]'),) != (('Me', '[email protected]'), ('Person1', '[email protected]')) 

所以它看起来是测试else分支由于settings.DEBUG设置不正确,然后提高AssertionError因为settings.MANAGERS设置正确。

如果我跑python manage.py shell我得到这个:

>>> from django.conf import settings 
>>> settings.DEBUG 
True 
>>> settings.MANAGERS 
(('Me', '[email protected]'),) 

所以他们正确设置在那里。

我知道我可以在我的测试中手动覆盖设置,但我想尝试使用settings.DEBUG,以便无论测试是在本地运行还是在生产中都能通过。

任何想法?

+1

的可能的复制[?如何进行单元测试与Django的不同设置(http://stackoverflow.com/questions/913549/how-to-unit-test-with-different-settings-in-django) –

回答

5

这是内Django的故意选择:

不管DEBUG设置的值在配置文件中,所有的Django的测试与调试运行=假。这是为了确保观察到的代码输出与在生产环境中看到的内容相匹配。

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

+0

哇,我完全错过了。谢谢! –

+0

这是NUTS。你应该如何调试你的测试?如果只有在DEBUG为False时设置了电子邮件,该怎么办? – MagicLAMP

+0

@MagicLAMP在这种情况下,您可以使用[override_settings](https://docs.djangoproject.com/zh/1.10/topics/testing/tools/#django.test.override_settings) – noisecapella

1

回想一下,您不应该在运行时以任何方式更改设置值,它会导致问题。

+1

django文档说不要这样做: 'settings.BLAH ='blah''设置文件外,但导入文件进入设置文件是kosher –

+0

啊,是的,你是对的。 –

2

使用--settings选项运行测试时

python manage.py test --settings=mysite.settings_local