在我的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/')
怎么可能轮到我?
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_url和target_status_code将是重定向链的最终点的网址和状态代码。
如果fetch_redirect_response是假 ,最后一页就不会被加载。 由于测试客户端无法获取外部URL,如果expected_url是不是你的Django应用程序的一部分,这是非常有用的。
两个网址之间进行比较时的方案是正确处理。 如果没有在我们被重定向到指定的位置的任何方案,则使用原来的要求的方案。 如果存在,在expected_url方案是用来做比较的一个。
您也可以遵循重定向:
response = self.client.get('/myprofile/data/some_id/', follow=True)
这将反映在浏览器中的用户体验,让你希望找到有,比如什么的断言:
self.assertContains(response, "You must be logged in", status_code=401)
您可以检查response['Location']
看看它是否与预期网址配衬。 检查也是状态代码为302。
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)