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:

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

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_urltarget_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)