簡體   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