2010-12-15 2 views
20

Мой сайт позволяет людям делиться своим содержанием в отсутствие после входа в систему путем создания пользователя на основе текущего session_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 

Мысли о том, как изменить сеанс клиента перед получением запросов на получение запроса? Я видел this и он не работает

+0

`session` является` dict`-подобный объект, вы должны использовать `s [х]`, чтобы получить и установить значения – xj9 2014-10-03 18:57:33

ответ

28

Вот как я это сделал (вдохновленный решением в 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() 

и т.д ...

33

Клиентский объект системы тестирования 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.update({ 
    "expire_date": '2010-12-05', 
    "session_key": 'my_session_key', 
}) 
s.save() 
response = self.client.get('/myview/') 
+8

Привет Люк, спасибо за вашу помощь, но это не сработает. Я получаю следующую ошибку: AttributeError: объект 'dict' не имеет атрибута 'save' Это происходит потому, что объект client.session является словарем. Кажется, что client.session становится истинным объектом Session после того, как запрос сделан (и только если пользователь вошел в систему). Любые другие предложения? Вы можете повторить это, введя (из оболочки): от django.test клиента импорта клиента = клиента() S = client.session s [ 'expire_date'] = '2010-12-05' s ['session_key'] = 'my_session_key' s.save() – Riley 2010-12-20 15:24:55

+5

Похоже, что предложенный luc должен работать, но его ошибка django: https://code.djangoproject.com/ticket/11475 – 2012-06-15 20:25:39

3

Вы можете создать пользовательский вид, который вставляет фиктивные данные, такие как сессии.

Вид с соответствующей URL:/манекен /:

def dummy(request): 
    # dummy init data 
    request.session['expiry_date'] = '2010-12-05' 
    return HttpResponse('Dummy data has been set successfully') 

чем в сценарии тестирования просто позвоните self.client.get('/dummy/')

Я также использую этот манекен вид на initilize фиктивных данных в сеансе при тестировании с помощью рука.

10

Как Эндрю Остин уже упоминалось, он не работает из-за этой ошибки: 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(), как и в приведенном выше коде, сеансы должны работать.

0

в соответствии с Документах вы можете добавлять значения в сессии в тестовом клиенте с помощью, например,

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() 
Смежные вопросы