繁体   English   中英

Django - 测试登录视图 - AttributeError: 'HttpRequest' 对象没有属性 'user'

[英]Django - Testing Login View - AttributeError: 'HttpRequest' object has no attribute 'user'

我正在尝试使用TestCase测试 Django 登录视图,但出现以下错误 -

ERROR: test_login_form (accounts.tests.LoginPageTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/farhan/Documents/_playground_new/django_playground/cbv-dfb/accounts/tests.py", line 53, in test_login_form
    logged_in = self.client.force_login(new_user)
  File "/home/farhan/Documents/_playground_new/django_playground/cbv-dfb/venv/lib/python3.8/site-packages/django/test/client.py", line 619, in force_login
    self._login(user, backend)
  File "/home/farhan/Documents/_playground_new/django_playground/cbv-dfb/venv/lib/python3.8/site-packages/django/test/client.py", line 631, in _login
    login(request, user, backend)
  File "/home/farhan/Documents/_playground_new/django_playground/cbv-dfb/venv/lib/python3.8/site-packages/django/contrib/auth/__init__.py", line 135, in login
    user_logged_in.send(sender=user.__class__, request=request, user=user)
  File "/home/farhan/Documents/_playground_new/django_playground/cbv-dfb/venv/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 180, in send
    return [
  File "/home/farhan/Documents/_playground_new/django_playground/cbv-dfb/venv/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 181, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
  File "/home/farhan/Documents/_playground_new/django_playground/cbv-dfb/accounts/views.py", line 29, in on_user_logged_out
    f"{request.user.username} successfully logged in!",
AttributeError: 'HttpRequest' object has no attribute 'user'

我有一个 user_logged_in 信号,它在登录时通过 Django 消息框架添加一条消息。这是代码 -


@receiver(user_logged_in)
def on_user_logged_in(sender, request, **kwargs):
    messages.add_message(
        request,
        messages.INFO,
        f"{request.user.username} successfully logged in!",
    )

这是单元测试的代码 -

class LoginPageTests(TestCase):
    username = "newuser"
    email = "newuser@email.com"
    password = "averydeifficultpasswordtobreak"

    def test_login_page_status_code(self):
        response = self.client.get("/accounts/login/")
        self.assertEqual(response.status_code, 200)

    def test_view_url_by_name(self):
        response = self.client.get(reverse("login"))
        self.assertEqual(response.status_code, 200)

    def test_view_uses_correct_template(self):
        response = self.client.get(reverse("login"))
        self.assertTemplateUsed(response, "registration/login.html")

    def test_login_form(self):
        new_user = get_user_model().objects.create_user(self.username, self.email)
        new_user.set_password(self.password)
        new_user.save()

        logged_in = self.client.login(username=self.username, password=self.password)
        self.assertEqual(logged_in, True)

如果我只是简单地注释掉信号代码,测试运行良好。 我该如何解决这个问题?

信号将 user 作为参数发送,因此请使用它而不是request.user

@receiver(user_logged_in)
def on_user_logged_in(sender, request, user, **kwargs):
    messages.add_message(
        request,
        messages.INFO,
        f"{user.username} successfully logged in!",
    )

请注意, self.client.login()使用的是 Django 测试客户端,它不像测试名称所暗示的那样测试登录表单。 要测试您的登录表单,您可以实例化登录表单并断言它的行为符合预期,或者您可能会对发布登录详细信息并断言当详细信息正确时视图登录用户的集成测试感到满意。

我正在进行测试并遇到了类似的问题。 您不断收到MessageFailure error因为您仍在signal使用HttpRequest 罪魁祸首是Client()处理后端但在message参数 ( HttpRequest ) 上有问题。

您可以查看我描述此类经历的主题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM