我的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测试客户端遵循重定向并对最终页面进行测试?
答案 0 :(得分:8)
以上都不适用于我(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)
答案 1 :(得分:6)
client.get
方法采用follow
参数,允许它遵循重定向:
response = self.client.get('/contact/', follow=True)
答案 2 :(得分:6)
虽然接受的答案是解决此问题的正确方法,但我只想指出您可以直接设置Cookie(即在您调用时接近编号(i)),但不是通过测试客户端。相反,您需要使用RequestFactory
来构建一个可以设置cookie的请求,然后将其直接传递给相关视图。
所以而不是:
response = self.client.get('/contact/')
你这样做:
request = RequestFactory().get('/contact/')
request.COOKIES['thing'] = 'whatever'
response = contact_view(request)
其中contact_view
是投放/contact/
的视图。
答案 3 :(得分:0)
您可以通过调用SimpleCookie对象的cookies
属性上的负载来为测试客户端设置Cookie。
from django.core import signing
self.client.cookies.load({
'example': '123',
'signed_example': signing.get_cookie_signer('signed_example').sign('123')
})
Django的测试客户端是有状态的-将在测试之间保留cookie,并忽略到期日期。要删除,您需要手动删除cookie或创建一个新客户端。 -See docs
---对于Python 3和Django 2 +