为什么我的Django单元测试不知道MessageMiddleware是否已安装?

Phi*_*ord 38 django unit-testing middleware messages

我正在研究一个Django项目并正在为它编写单元测试.但是,在测试中,当我尝试登录用户时,我收到此错误:

MessageFailure: You cannot add messages without installing django.contrib.messages.middleware.MessageMiddleware
Run Code Online (Sandbox Code Playgroud)

登录实际站点工作正常 - 并使用MessageMiddleware显示登录消息.

在我的测试中,如果我这样做:

from django.conf import settings
print settings.MIDDLEWARE_CLASSES
Run Code Online (Sandbox Code Playgroud)

然后它输出:

('django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware')
Run Code Online (Sandbox Code Playgroud)

这似乎表明在运行测试时安装了MessageMiddleware.

我有一个明显的步骤吗?

UPDATE

根据下面的建议,它确实看起来像是一个设置的东西.

我目前settings/__init__.py喜欢这个:

try:
    from settings.development import *
except ImportError:
    pass
Run Code Online (Sandbox Code Playgroud)

settings/defaults.py包含大部分标准设置(包括MIDDLEWARE_CLASSES).然后settings.development.py覆盖其中一些默认值,如下所示:

from defaults import *

DEBUG = True
# etc
Run Code Online (Sandbox Code Playgroud)

使用开发设置看起来我的开发站点本身工作正常.但是,虽然测试似乎加载设置OK(默认和开发)settings.DEBUG设置为False.我不知道为什么,或者这是否是问题的原因.

Tar*_*edo 59

使用RequestFactory创建请求时,Django 1.4 有一个错误.

要解决此问题,请使用RequestFactory创建请求并执行以下操作:

from django.contrib.messages.storage.fallback import FallbackStorage
setattr(request, 'session', 'session')
messages = FallbackStorage(request)
setattr(request, '_messages', messages)
Run Code Online (Sandbox Code Playgroud)

适合我!

  • 它实际上没有错误,但预期的行为 (7认同)
  • 这应该进入“测试消息”部分中的文档 (2认同)
  • 这一直有效,直到我尝试在“session”中创建一个键/值,这会导致“str”对象不支持项目分配...第二行不能是“setattr(request, 'session', {”) })`? 这样你就可以使用一个空的“dict”,而不是一个不可变的“str”。 (2认同)
  • 并且仍然存在于2.0.6中 (2认同)