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