如何在Django中正确测试需要会话的中间件?

时间:2011-06-22 19:10:57

标签: django django-testing django-middleware

我正在试图弄清楚如何在django中测试中间件。我正在写的中间件在某些条件下登录用户(如果在电子邮件中发送的密钥有效)。显然我依赖于django.contrib.authdjango.contrib.sessions

我在测试登录部分时遇到了问题。我正在提出这样的请求:

user = User.objects.create_user('user', 'user@example.org', 'password')
key = LoginKey.objects.create(user=user)
request = self.factory.get('/', data={'auth_key': key.hash}) # self.factory is a RequestFactory()
self.middleware.process_request(request) # self.middleware is MyMiddleware()

由于未设置会话而失败。接下来,我在我的测试类中写了一个小片段:

def make_session(self, request):
    SessionMiddleware().process_request(request)

由于'User' object has no attribute 'backend'而失败。我不确定它的含义,但我怀疑我需要运行我已经安装的所有中间件。

我真的不想为了运行中间件而做出虚假的观点,但此时我看不到另一种选择。

所以我只是想知道,在我不得不一直追逐这只兔子之前,有没有办法做到这一点,不需要那么多的胶带?

1 个答案:

答案 0 :(得分:1)

您应该使用测试客户端。这将确保运行中间件并创建会话密钥。

response = self.client.get('/?auth_key=%s' % key.hash)
self.assertTrue(response.context['user'].is_authenticated()) # for example