Атрибут session

Атрибут session класса Client используется в тестах Django для доступа к данным сессии пользователя. Это позволяет проверять и изменять значения, хранящиеся в сессии, что особенно полезно при тестировании функциональности, зависящей от состояния сессии. Атрибут предоставляет объект, имитирующий сессию, с которым можно работать как со словарем.

Важно понимать, что изменения, внесенные в атрибут session, не сохраняются автоматически в базе данных сессий. Для сохранения изменений необходимо явно вызвать метод save. Это позволяет контролировать момент сохранения данных и избегать неожиданных побочных эффектов во время тестов.

Синтаксис

python# Получение доступа к сессии
session = client.session

# Чтение значения
value = session.get('key', default_value)

# Установка значения
session['key'] = value

# Удаление ключа
del session['key']

# Сохранение изменений
session.save()

Пример

Давайте проверим, что в сессии сохраняется количество посещений страницы пользователем:

pythonfrom django.test import TestCase
from django.test import Client

class SessionTest(TestCase):
  def test_session_counter(self):
    client = Client()

    # Получаем доступ к сессии
    session = client.session

    # Устанавливаем начальное значение счетчика
    session['visits'] = 0
    session.save()

    # Имитируем посещение страницы
    response = client.get('/some-page/')

    # Проверяем, что счетчик увеличился
    session = client.session
    self.assertEqual(session['visits'], 1)

Пример

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

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

class SessionAuthTest(TestCase):
  def setUp(self):
    self.user = User.objects.create_user(
      username='testuser',
      password='testpass123'
    )

  def test_user_data_in_session(self):
    client = Client()

    # Авторизуем пользователя
    client.login(username='testuser', password='testpass123')

    # Проверяем данные в сессии
    session = client.session
    self.assertEqual(session['_auth_user_id'], str(self.user.id))
    self.assertEqual(session['_auth_user_backend'], 'django.contrib.auth.backends.ModelBackend')

Пример

Протестируем работу корзины покупок, которая хранится в сессии:

pythonfrom django.test import TestCase
from django.test import Client

class CartTest(TestCase):
  def test_cart_operations(self):
    client = Client()

    # Добавляем товар в корзину через сессию
    session = client.session
    session['cart'] = [{'id': 1, 'quantity': 2}]
    session.save()

    # Проверяем, что корзина не пуста
    session = client.session
    self.assertTrue('cart' in session)
    self.assertEqual(len(session['cart']), 1)
    self.assertEqual(session['cart'][0]['id'], 1)
    self.assertEqual(session['cart'][0]['quantity'], 2)

    # Очищаем корзину
    session['cart'] = []
    session.save()

    # Проверяем, что корзина пуста
    session = client.session
    self.assertEqual(session['cart'], [])

Пример

Проверим, что сообщения (messages) правильно сохраняются в сессии:

pythonfrom django.test import TestCase
from django.test import Client
from django.contrib.messages import get_messages

class MessagesTest(TestCase):
  def test_message_in_session(self):
    client = Client()

    # Выполняем действие, которое добавляет сообщение
    response = client.post('/submit-form/', {'data': 'test'})

    # Проверяем сообщения через сессию
    session = client.session
    self.assertIn('_messages', session)

    messages = list(get_messages(response.wsgi_request))
    self.assertEqual(len(messages), 1)
    self.assertEqual(str(messages[0]), 'Form submitted successfully')

Смотрите также

  • класс Client,
    который предоставляет атрибут для работы с сессией
  • метод login,
    который автоматически управляет сессией пользователя
  • класс TestCase,
    который использует клиент для тестирования
  • метод post,
    который передает данные и может изменять сессию