使用Django Cache Middleware会导致contrib.auth单元测试失败

时间:2010-07-10 14:59:13

标签: django unit-testing django-contrib

问题:当我将UpdateCacheMiddleware和FetchFromCacheMiddleware添加到我的Django项目时,我得到了单元测试失败。这与我使用的CACHE_BACKEND无关(现在我正在使用locmem://,但是当我使用file:/// path_to_cache时错误是相同的)

我的中间件:

MIDDLEWARE_CLASSES = (
    '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.cache.FetchFromCacheMiddleware',
)

我的所有测试失败如下所示:'NoneType'对象是不可取消的

======================================================================
Error: test_last_login (django.contrib.auth.tests.remote_user.RemoteUserTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\django\contrib\auth\tests\remote_user.py",
 line 87, in test_last_login
    self.assertNotEqual(default_login, response.context['user'].last_login)
TypeError: 'NoneType' object is unsubscriptable

我必须遗漏某些东西(或做错事),因为我在网上搜索了这个问题,但似乎没有人遇到过它。

重现步骤:

  1. 启动一个新的django项目(django-admin.py startproject myproject)并配置settings.py
  2. 将CACHE_BACKEND添加到settings.py并从Django添加两个缓存中间件
  3. 运行python manage.py test
  4. 注意:使用dummy:// cache时只有一次测试失败,并记录在:http://code.djangoproject.com/ticket/11640

1 个答案:

答案 0 :(得分:4)

失败测试的解决方案是将CACHE_MIDDLEWARE_SECONDS设置为0(例如,在您的开发环境中将此值设置为0)。这将允许django.contrib测试全部通过。