Django:在测试客户机上设置cookie?

2024-04-26 22:24:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Django站点设置了一些中间件,这些中间件在每次请求时检查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测试客户机遵循重定向并针对最终页面进行测试?


Tags: 中间件django用户intestself客户机站点
3条回答

以上都不适合我(Django1.9,Python3.4)。找到此解决方案here

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)

client.get方法接受一个follow参数,该参数允许它遵循重定向:

response = self.client.get('/contact/', follow=True)

虽然接受的答案是解决此问题的正确方法,但我只想指出,您可以直接设置cookies(即,您所称的方法号(I)),而不是通过测试客户机。相反,您需要使用^{}来构造一个可以设置cookie的请求,然后将其直接传递给相关视图。

所以不是:

response = self.client.get('/contact/')

你需要:

request = RequestFactory().get('/contact/')
request.COOKIES['thing'] = 'whatever'
response = contact_view(request)

其中contact_view是服务于/contact/的视图。

相关问题 更多 >