我正在试图弄清楚如何在django中测试中间件。我正在写的中间件在某些条件下登录用户(如果在电子邮件中发送的密钥有效)。显然我依赖于django.contrib.auth
和django.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'
而失败。我不确定它的含义,但我怀疑我需要运行我已经安装的所有中间件。
我真的不想为了运行中间件而做出虚假的观点,但此时我看不到另一种选择。
所以我只是想知道,在我不得不一直追逐这只兔子之前,有没有办法做到这一点,不需要那么多的胶带?
答案 0 :(得分:1)
您应该使用测试客户端。这将确保运行中间件并创建会话密钥。
response = self.client.get('/?auth_key=%s' % key.hash)
self.assertTrue(response.context['user'].is_authenticated()) # for example