77

在我的 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/')

接下来可能会发生什么?

4

5 回答 5

132

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接收的。

如果您的请求使用了follow参数,则expected_urltarget_status_code将是重定向链最后点的 url 和状态码。

如果fetch_redirect_responseFalse,则不会加载最终页面。由于测试客户端无法获取外部 URL,因此如果expected_url不是您的 Django 应用程序的一部分,这将特别有用。

在两个 URL 之间进行比较时,Scheme 得到了正确处理。如果我们重定向到的位置没有指定任何方案,则使用原始请求的方案。如果存在,则expected_url中的方案是用于进行比较的方案。

于 2013-02-19T09:27:04.943 回答
59

您还可以使用以下重定向:

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

这将反映浏览器中的用户体验并断言您希望在那里找到的内容,例如:

self.assertContains(response, "You must be logged in", status_code=401)
于 2013-10-29T18:28:35.500 回答
35

您可以检查response['Location']它是否与预期的 url 匹配。还要检查状态代码是否为 302。

于 2013-02-19T06:45:04.130 回答
13

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)
于 2016-08-16T16:19:46.047 回答
2

您可以使用 assertRedirects 例如:

response = self.client.get('/sekrit/')
self.assertRedirects(response, '/other/login/?next=/sekrit/')

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

如果您需要获取重定向的 url

如果followTrue

你会得到网址

response.redirect_chain[-1]

如果followFalse

response.url
于 2021-01-11T07:24:34.220 回答