Как изменить сеанс в тестовой среде Django
Мой сайт позволяет людям вносить контент в отсутствие входа в систему, создавая пользователя на основе текущего сеанса_key
Я хотел бы настроить тест для моего представления, но кажется, что изменить request.session невозможно:
Я хотел бы сделать это:
from django.contrib.sessions.models import Session
s = Session()
s.expire_date = '2010-12-05'
s.session_key = 'my_session_key'
s.save()
self.client.session = s
response = self.client.get('/myview/')
Но я получаю ошибку:
AttributeError: can't set attribute
Мысли о том, как изменить сеанс клиента перед получением запросов на получение?
Я видел этот и, похоже, не работает
Ответы
Ответ 1
Вот как я это сделал (вдохновленный решением в http://blog.mediaonfire.com/?p=36).
from django.test import TestCase
from django.conf import settings
from django.utils.importlib import import_module
class SessionTestCase(TestCase):
def setUp(self):
# http://code.djangoproject.com/ticket/10899
settings.SESSION_ENGINE = 'django.contrib.sessions.backends.file'
engine = import_module(settings.SESSION_ENGINE)
store = engine.SessionStore()
store.save()
self.session = store
self.client.cookies[settings.SESSION_COOKIE_NAME] = store.session_key
После этого вы можете создать свои тесты как:
class BlahTestCase(SessionTestCase):
def test_blah_with_session(self):
session = self.session
session['operator'] = 'Jimmy'
session.save()
и т.д...
Ответ 2
Клиентский объект среды тестирования django позволяет коснуться сессии. Посмотрите http://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.session для деталей
Будьте осторожны: To modify the session and then save it, it must be stored in a variable first (because a new SessionStore is created every time this property is accessed)
Я думаю, что что-то вроде этого ниже должно работать
s = self.client.session
s["expire_date"] = '2010-12-05'
s["session_key"] = 'my_session_key'
s.save()
response = self.client.get('/myview/')
Ответ 3
Как уже упоминал Эндрю Остин, это не работает из-за этой ошибки: https://code.djangoproject.com/ticket/11475
Что вы можете сделать, так это:
from django.test import TestCase
from django.test.client import Client
from django.contrib.auth.models import User
class SessionTestCase(TestCase):
def setUp(self):
self.client = Client()
User.objects.create_user('john', '[email protected]', 'johnpassword')
self.client.login(username='john', password='johnpassword')
def test_something_with_sessions(self):
session = self.client.session
session['key'] = 'value'
session.save()
После создания и входа в систему пользователя с User.objects.create_user() и self.client.login(), как и в приведенном выше коде, сеансы должны работать.
Ответ 4
Вы можете создать настраиваемое представление, в которое вставляются фиктивные данные, такие как сеанс.
Вид с соответствующим url:/dummy/:
def dummy(request):
# dummy init data
request.session['expiry_date'] = '2010-12-05'
return HttpResponse('Dummy data has been set successfully')
Чем в тесте script просто позвоните self.client.get('/dummy/')
Я также использую этот манекен для инициализации фиктивных данных в сеансе при проверке вручную.
Ответ 5
Вы можете изменить сеанс с помощью middleware.
Ответ 6
в соответствии с документами вы можете добавлять значения в сеанс в тестовом клиенте, например,
def test_something(self):
session = self.client.session
session['somekey'] = 'test'
session.save()
https://docs.djangoproject.com/en/dev/topics/testing/tools/#django.test.Client.session
Это позволит вам проверять представления, которые требуют правильной работы данных в сеансе.
Итак, для этого вопроса:
session = self.client.session
session['expire_date'] = '2010-12-05'
.....
session.save()