我有一个使用内置登录系统的 Django 应用程序。
我正在尝试编写一个单元测试,以验证login
url 是否重定向到home
用户是否已通过身份验证。 这意味着,如果已经过身份验证的用户尝试访问login
URL,他们将被重定向到home
。
这是 DjangoLoginView
的内置功能,我已经验证了它确实在工作。 但是,我不确定如何为此编写单元测试。
问:如何验证此重定向是否通过单元测试发生?LoginView
返回一个没有url
参数的TemplateResponse
。
到目前为止,我所拥有的是这样的:
from django.test import TestCase
from django.urls import reverse
home = reverse('home')
login = reverse('login')
logout = reverse('logout')
signup = reverse('signup')
USER_CREDS = { some users credentials }
class TestLoginView(TestCase):
def test_login_redirect(self):
self.client.post(signup, USER_CREDS)
self.client.get(logout)
self.client.post(login, USER_CREDS)
response = self.client.get(login)
self.assertRedirects(response, home)
编辑:SimpleTestCase.assertRedirects
不适用于TemplateResponse
对象。
TemplateResponse
对象不包含url
参数,这是SimpleTestCase.assertRedirect
所必需的。
该方法引发以下错误:AttributeError: 'TemplateResponse' object has no attribute 'url'
这与链接的问题不同,因为来自LoginView
的响应对象是TemplateResponse
,而不是HttpResponse
。
您可以使用断言重定向检查登录过程是否重定向到所需的命名 URL:
SimpleTestCase.assertRedirects(response, expected_url, status_code=302, target_status_code=200, msg_prefix='', fetch_redirect_response=True)
断言响应返回status_code重定向状态, 重定向到expected_url(包括任何GET数据(,并且 最后一页收到target_status_code。
然后在测试中:
self.assertRedirects(response, home)
编辑
我刚刚遇到了类似的问题,几点说明:
您可以使用跳过身份验证和验证步骤的TestCase.force_login
,而不是执行登录过程。
class TestLoginView(TestCase):
def test_login_redirect(self):
self.client.force_login(user)
# logged user retrieves the login page
response = self.client.get(login)
self.assertRedirects(response, home)
响应应该是 302 重定向到home
:<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/">
如果您在执行response = self.client.get(login)
时没有收到重定向,则意味着它正在加载登录页面,这是您不想要的,因此您必须修复该错误。
因此,问题不在于 TemplateResponse 对象不包含 url 参数,而在于您的login
页面没有将登录用户重定向到主页。