Django的:测试页面是否已经重定向到所需的URL(Django : Testing if the

2019-07-20 02:56发布

在我的Django应用程序,我有一个认证系统。 所以,如果我不登录并试图访问某些配置文件中的个人信息,我重定向到登录页面。

现在,我需要编写测试用例这一点。 从浏览器中我得到的是的回应:

GET /myprofile/data/some_id/ HTTP/1.1 302 0
GET /account/login?next=/myprofile/data/some_id/ HTTP/1.1 301 0
GET /account/login?next=/myprofile/data/some_id/ HTTP/1.1 200 6533

我怎样写我的测试? 这是我到目前为止有:

self.client.login(user="user", password="passwd")
response = self.client.get('/myprofile/data/some_id/')
self.assertEqual(response.status,200)
self.client.logout()
response = self.client.get('/myprofile/data/some_id/')

怎么可能轮到我?

Answer 1:

Django的1.4:

https://docs.djangoproject.com/en/1.4/topics/testing/#django.test.TestCase.assertRedirects

Django的2.0:

https://docs.djangoproject.com/en/2.0/topics/testing/tools/#django.test.SimpleTestCase.assertRedirects

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好评。

如果您的请求中使用的跟踪参数,expected_urltarget_status_code将是重定向链的最终点的网址和状态代码。

如果fetch_redirect_response ,最后一页就不会被加载。 由于测试客户端无法获取外部URL,如果expected_url是不是你的Django应用程序的一部分,这是非常有用的。

两个网址之间进行比较时的方案是正确处理。 如果没有在我们被重定向到指定的位置的任何方案,则使用原来的要求的方案。 如果存在,在expected_url方案是用来做比较的一个。



Answer 2:

您也可以遵循重定向:

response = self.client.get('/myprofile/data/some_id/', follow=True)

这将反映在浏览器中的用户体验,让你希望找到有,比如什么的断言:

self.assertContains(response, "You must be logged in", status_code=401)


Answer 3:

您可以检查response['Location']看看它是否与预期网址配衬。 检查也是状态代码为302。



Answer 4:

response['Location']中不存在1.9。 使用这个来代替:

response = self.client.get('/myprofile/data/some_id/', follow=True)
last_url, status_code = response.redirect_chain[-1]
print(last_url)


文章来源: Django : Testing if the page has redirected to the desired url