Django:如何在测试客户端设置Cookie?
我的Django网站设置了一些中间件,每次请求时都会检查是否有一个cookie,如果没有这个cookie,就会把用户转到其他地方。
现在我想对这个网站进行一些测试。这是我的代码:
def test_contactform(self):
response = self.client.get('/contact/')
self.assertEqual(response.status_code, 200)
print response
self.assertTrue('Contact me' in response.content)
不幸的是,这个测试失败了,错误信息是:
Vary: Cookie
Content-Type: text/html; charset=utf-8
Location: http://testserver/ldap/?next=/contact/
Traceback (most recent call last):
File "tests.py", line 43, in test_contactform
self.assertEqual(response.status_code, 200)
AssertionError: 302 != 200
我想知道我是否可以(i)在Django测试客户端上设置一个cookie(如果可以的话,怎么做),或者(ii)让Django测试客户端跟随重定向,并在最终页面进行测试?
5 个回答
12
虽然被接受的答案是解决这个问题的正确方法,但我想提醒你,其实你可以直接设置 cookies(也就是你说的第一种方法),不过不能通过测试客户端来实现。相反,你需要使用一个叫做 RequestFactory
的工具来构建一个请求,然后在这个请求上设置 cookie,最后把这个请求直接传给你要测试的视图。
所以,不是这样:
response = self.client.get('/contact/')
而是这样:
request = RequestFactory().get('/contact/')
request.COOKIES['thing'] = 'whatever'
response = contact_view(request)
这里的 contact_view
是处理 /contact/
路径的视图。
26
以上的方法对我都没用(我用的是Django1.9和Python3.4)。我找到了解决办法,具体可以在这里查看:
from django.test import TestCase
from http.cookies import SimpleCookie
class TestViewWithCookies(TestCase):
def test_votes(self):
self.client.cookies = SimpleCookie({'name': 'bla'})
response = self.client.get('/vote/2')
self.assertEqual(response.status_code, 200)
7
client.get
方法有一个叫 follow
的参数,这个参数可以让它自动跟随重定向。
response = self.client.get('/contact/', follow=True)