Django: установить cookie на тестовом клиенте?

#python #django

#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)
  

К сожалению, это не удается с:

 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) установить cookie на тестовом клиенте Django (и если да, то каким образом), либо (ii) потребовать, чтобы тестовый клиент Django следовал перенаправлению и тестировался на конечной странице?

Ответ №1:

У меня ничего из вышеперечисленного не сработало (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)
  

Ответ №2:

Хотя принятый ответ является правильным подходом к этой проблеме, я просто хочу отметить, что вы можете установить 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:

Вы можете установить cookie для тестового клиента, вызвав cookies атрибут load on, который является объектом SimpleCookie.

 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

Ответ №4:

client.get Метод принимает follow аргумент, который позволяет ему следовать перенаправлениям:

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

Ответ №5:

Это старый вопрос, но, возможно, это кому-то удобно:

 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)