Django:如何在测试客户端设置Cookie?

17 投票
5 回答
16658 浏览
提问于 2025-04-16 15:17

我的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)

撰写回答