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

标签 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())

用户填写表格并点击提交,然后收到一封带有验证网址的电子邮件。在他点击电子邮件中的验证 url 后,他应该被定向到该站点并进行身份验证。我的问题是,查明用户是否通过身份验证的好方法是什么?在这种情况下注销用户的首选方法是什么?我想检查用户是否已注销并第二次单击验证链接是否不起作用。我尝试了一些事情,例如:

client.logout()

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

感谢您的帮助!

最佳答案

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

关于django 测试 response.request.user.is_authenticated() 在注销后返回 True,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28545268/

相关文章:

django - Ajax ,Django : status 200 but throws error instead of success

django - 在 Mac (10.6.8) 上为 Django 初始化 virtualenvwrapper

python - 如何在 Django 单元测试中手动测试提交

Django - 测试适用于 ajax 请求的 View

python - 对 django 应用程序进行单元测试的良好方法/设计

django - ImportError 没有名为 View 的模块

python - Heroku Django db postgres 错误

django - 我一直在/admin/login/中获取RelatedObjectDoesNotExist。如何通过一对一关系在Django中成功创建用户个人资料?

python - 如何在 Django 管理中测试覆盖函数?

Django 单元测试 - 无法创建 django_migrations 表