Атрибут session
Атрибут session класса Client используется
в тестах Django для доступа к данным сессии пользователя.
Это позволяет проверять и изменять значения, хранящиеся
в сессии, что особенно полезно при тестировании
функциональности, зависящей от состояния сессии.
Атрибут предоставляет объект, имитирующий сессию,
с которым можно работать как со словарем.
Важно понимать, что изменения, внесенные в атрибут
session, не сохраняются автоматически в базе данных
сессий. Для сохранения изменений необходимо явно
вызвать метод save. Это позволяет контролировать
момент сохранения данных и избегать неожиданных
побочных эффектов во время тестов.
Синтаксис
# Получение доступа к сессии
session = client.session
# Чтение значения
value = session.get('key', default_value)
# Установка значения
session['key'] = value
# Удаление ключа
del session['key']
# Сохранение изменений
session.save()
Пример
Давайте проверим, что в сессии сохраняется количество посещений страницы пользователем:
from 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)
Пример
Проверим, что в сессии сохраняются данные пользователя после успешной авторизации:
from 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')
Пример
Протестируем работу корзины покупок, которая хранится в сессии:
from 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) правильно сохраняются в сессии:
from 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')