Как использовать сессию в TestCase в Django? - PullRequest
12 голосов
/ 21 сентября 2011

Я хотел бы прочитать некоторые переменные сессии из теста (Django TestCase)

Как это сделать чистым способом?

def test_add_docs(self):
    """
    Test add docs
    """
    # I would access to the session here:
    self.request.session['documents_to_share_ids'] = [1]

    response = self.client.get(reverse(self.document_add_view_id, args=[1]), follow=True)
    self.assertEquals(response.status_code, 200)

Ответы [ 4 ]

17 голосов
/ 21 сентября 2011

К сожалению, это не так просто, как вы надеетесь в данный момент.Как вы могли заметить, простое использование self.client.session не будет работать, если вы не вызывали другие представления, которые настроили сеансы с соответствующими сессионными cookie-файлами для вас.Затем хранилище / cookie сеанса необходимо настроить вручную или с помощью других представлений.

Существует открытый тикет, чтобы упростить имитацию сеансов с помощью тестового клиента: https://code.djangoproject.com/ticket/10899

Помимо обходного пути в заявке, есть хитрость, которую можно использовать, если вы используете django.contrib.auth.Метод login() тестовых клиентов устанавливает хранилище / файл cookie сеанса, который можно будет использовать позже в тесте.

Если у вас есть другие представления, которые устанавливают сеансы, их запрос тоже поможет (возможно, у вас естьдругое представление, которое устанавливает сеансы, иначе ваше представление, которое читает сеансы, будет довольно непригодным для использования).

from django.test import TestCase
from django.contrib.auth.models import User

class YourTest(TestCase):
    def test_add_docs(self):
        # If you already have another user, you might want to use it instead
        User.objects.create_superuser('admin', 'foo@foo.com', 'admin')

        # self.client.login sets up self.client.session to be usable
        self.client.login(username='admin', password='admin')

        session = self.client.session
        session['documents_to_share_ids'] = [1]
        session.save()

        response = self.client.get('/')  # request.session['documents_to_share_ids'] will be available
16 голосов
/ 18 мая 2016

Начиная с Django 1.7+ это намного проще.Убедитесь, что вы установили сессию как переменную вместо прямой ссылки на нее.

def test_something(self):
    session = self.client.session
    session['somekey'] = 'test'
    session.save()

и обходной путь rereaspelme необходим только в старых версиях django.См документы

3 голосов
/ 22 августа 2017

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

from django.contrib.sessions.middleware import SessionMiddleware
from django.http import HttpRequest


request = HttpRequest()

middleware = SessionMiddleware()
middleware.process_request(request)

request.session.save()
0 голосов
/ 21 сентября 2011

Вы должны иметь возможность доступа к переменным сеанса Client через его свойство session, поэтому я думаю, self.client.session['documents_to_share_ids'] = [1] должно быть тем, что вы ищете!

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