簡體   English   中英

Django:在測試客戶端上設置cookie?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM