django测试response.request.user.is_authenticated()在注销后返回True

时间:2015-02-16 15:51:24

标签: django django-unittest

我正在尝试为我的应用程序的身份验证部分编写一些测试,但是在检查用户是否登录时遇到了问题。这是代码:

    client = Client()

    # user signup form
    response = client.post(signup_url, data={
        'email': "lorem@ipsum.pl",
        'password1': 'hunter2',
        'password2': 'hunter2',
    }, follow=True)

    # checking if the user is logged in
    with self.assertRaises(KeyError):
        client.session['_auth_user_id']

    self.assertEquals(len(mail.outbox), 1)
    url = find_verification_url(mail.outbox[0].body)
    response = client.get(url, follow=True)
    self.assertEqual(200, response.status_code)

    user = User.objects.get(email="lorem@ipsum.pl")

    self.assertEqual(client.session['_auth_user_id'], user.pk)

    # how to logout a user?
    force_logout()

    self.assertFalse(response.request.user.is_authenticated())

用户填写表单并点击提交,然后收到包含验证网址的电子邮件。他点击电子邮件中的验证网址后,他应该被定向到该网站并进行身份验证。我的问题是,找出用户是否经过身份验证的好方法是什么?在这种情况下注销用户的首选方法是什么?我想检查一下,如果用户退出并点击链接,则第二次验证链接无法正常工作。我试过了一些像:

client.logout()

但不幸的是,即使我删除了这一行,它似乎每两次工作一次。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

好的问题是,身份验证系统使用时间戳功能来了解网址是否已过期。在测试中运行时,验证URL未应该到期。注销后的登录请求太快,系统认为验证URL仍然有效且用户已通过身份验证。这就是user.is_authenticated()一直返回True的原因。