python - Django - 测试登录视图 - AttributeError:'HttpRequest'对象没有属性'user'
问题描述
我正在尝试使用 Django Login View 测试,TestCase
但出现以下错误 -
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 测试客户端,它并没有像测试名称所暗示的那样测试登录表单。要测试您的登录表单,您可以实例化登录表单并断言其行为符合预期,或者您可能对发布登录详细信息并断言当详细信息正确时视图登录用户的集成测试感到满意。
推荐阅读
- python - pip install simple-crypt - 在 rhel7 中失败
- macos - 如何从聚合 CoreAudio 设备中排除输入或输出通道?
- linux - 按照官方说明安装rclone但权限被拒绝
- arrays - 统一选择特定数组
- python - 将重复列表数据移至表
- flutter - Flutter中使用ChangeNotifierProvider的堆栈溢出错误?
- perl - 在调用“value”方法之前测试 perl cookie/value 是否存在
- python - Open3D 错误:GLFW 错误:WGL:无法使上下文成为当前:不支持请求的转换操作
- tensorflow - 如何连接不通过层的输入
- php - 防止 Laravel Eloquent 的自我关系中的递归