[英]Django: set cookie on test client?
我的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測試客戶端遵循重定向並測試最終頁面?
以上都不適用於我(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)
雖然接受的答案是解決此問題的正確方法,但我只想指出您可以直接設置cookie(即在您調用時接近編號(i)),但不能通過測試客戶端。 相反,您需要使用RequestFactory
來構造一個可以設置cookie的請求,然后將其直接傳遞給相關視圖。
所以代替:
response = self.client.get('/contact/')
你做:
request = RequestFactory().get('/contact/')
request.COOKIES['thing'] = 'whatever'
response = contact_view(request)
其中contact_view
是視圖服務/contact/
。
client.get
方法采用follow
參數,允許它遵循重定向:
response = self.client.get('/contact/', follow=True)
這是一個古老的問題,但也許這對某人來說很方便:
from http.cookies import SimpleCookie
from django.test import TestCase, Client
class CookieClientTests(TestCase):
def test_cookie(self):
cookies = SimpleCookie()
cookies["cookie_key"] = "something"
client = Client(HTTP_COOKIE=cookies.output(header='', sep='; '))
resp = client.get("/")
self.assertEqual(200, resp.status_code)
您可以通過調用load on cookies
屬性(即SimpleCookie對象)為測試客戶端設置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或創建新客戶端。 - 見文檔
---對於Python 3和Django 2+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.