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

sim*_*mon 8 python django

我的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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这失败了:

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
Run Code Online (Sandbox Code Playgroud)

我可以(i)在Django测试客户端上设置cookie(如果是这样)或者(ii)要求Django测试客户端遵循重定向并测试最终页面?

Ana*_*ana 10

以上都不适用于我(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)
Run Code Online (Sandbox Code Playgroud)

  • 要使这个工作在py2和py3中你可以使用`来自django.http.cookie import SimpleCookie` :) (2认同)

Dan*_*man 6

client.get方法采用一个follow允许它遵循重定向的参数:

response = self.client.get('/contact/', follow=True)
Run Code Online (Sandbox Code Playgroud)


gim*_*and 6

虽然接受的答案是解决此问题的正确方法,但我只想指出您可以直接设置cookie(即在您调用时接近编号(i)),但不能通过测试客户端.相反,您需要使用a RequestFactory来构造一个可以设置cookie的请求,然后将其直接传递给相关视图.

所以代替:

response = self.client.get('/contact/')
Run Code Online (Sandbox Code Playgroud)

你做:

request = RequestFactory().get('/contact/')
request.COOKIES['thing'] = 'whatever'
response = contact_view(request)
Run Code Online (Sandbox Code Playgroud)

contact_view视图在哪里服务/contact/.

  • 你用的是什么版本的django?在1.7中你可以根据请求设置这样的cookie:`self.client.get('xyz',cookies = Cookie.SimpleCookie())` (4认同)

pis*_*329 6

您可以通过在SimpleCookie对象的cookies属性上调用 load 来为测试客户端设置 cookie 。

from django.core import signing

self.client.cookies.load({
    'example': '123',
    'signed_example': signing.get_cookie_signer('signed_example').sign('123')
})
Run Code Online (Sandbox Code Playgroud)

Django 的测试客户端是有状态的 - 将在测试之间保留 cookie 并忽略过期日期。如需移除,您需要手动移除 cookie 或创建新客户端。-查看文档

--- 对于 Python 3 和 Django 2+