Django:testing页面是否已redirect到所需的url
在我的Django应用程序中,我有一个身份validation系统。 所以,如果我不login并尝试访问某个个人资料的个人信息,我将被redirect到一个login页面。
现在,我需要为此写一个testing用例。 我得到的浏览器的回应是:
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
我如何编写我的testing? 这是我迄今为止:
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/')
接下来会发生什么?
Django 1.4:
https://docs.djangoproject.com/en/1.4/topics/testing/#django.test.TestCase.assertRedirects
Django 1.7:
SimpleTestCase.assertRedirects(response, expected_url, status_code=302, target_status_code=200, host=None, msg_prefix='', fetch_redirect_response=True)
断言该响应返回了一个status_coderedirect状态,redirect到expected_url (包括任何GET数据),并且最终页面被target_status_code接收。
如果您的请求使用了跟随参数, expected_url和target_status_code将是redirect链的最后一个点的url和status代码。
如果expected_url不包含一个(例如
"/bar/"
),则host参数将设置一个默认主机。 如果expected_url是包含主机的绝对URL(例如"http://testhost/bar/"
),则主机参数将被忽略。 请注意,testing客户端不支持获取外部URL,但是如果使用自定义HTTP主机进行testing(例如,使用客户端初始化testing客户端(HTTP_HOST =“testhost”)) ,则此参数可能很有用。
您也可以按照以下redirect:
response = self.client.get('/myprofile/data/some_id/', follow=True)
这将反映浏览器中的用户体验,并对您期望在其中find的内容做出断言,例如:
self.assertContains(response, "You must be logged in", status_code=401)
你可以检查response['Location']
,看看它是否与预期的url匹配。 检查状态码是302。
1.9中不存在response['Location']
。 用这个代替:
response = self.client.get('/myprofile/data/some_id/', follow=True) last_url, status_code = response.redirect_chain[-1] print(last_url)