Как изменить сессию в тестовой среде Django - PullRequest
25 голосов
/ 15 декабря 2010

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

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

Ответы [ 6 ]

47 голосов
/ 15 декабря 2010

Клиентский объект инфраструктуры тестирования 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/')
32 голосов
/ 11 октября 2011

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

и т.д ...

11 голосов
/ 04 марта 2013

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

3 голосов
/ 16 апреля 2011

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

Представление с соответствующим URL: / dummy /:

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/')

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

1 голос
/ 07 декабря 2017

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

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()
0 голосов
/ 15 декабря 2010

Вы можете изменить сеанс с помощью промежуточного программного обеспечения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...