Атрибут client

Атрибут client доступен в каждом тестовом классе, наследующем от TestCase. Он представляет собой экземпляр тестового клиента Django, который позволяет отправлять GET, POST, PUT, DELETE и другие запросы к вашему приложению, проверять полученные ответы и состояние сессии. Клиент автоматически создаётся для каждого тестового метода и не требует явной инициализации.

Синтаксис

pythonclass MyTestCase(TestCase):
  def test_example(self):
    response = self.client.get('/some-url/')
    # или
    response = self.client.post('/submit/', data={'key': 'value'})

Пример . GET-запрос

Давайте проверим, что главная страница доступна и возвращает статус код 200:

pythonfrom django.test import TestCase

class HomePageTest(TestCase):
  def test_home_page_status_code(self):
    response = self.client.get('/')
    self.assertEqual(response.status_code, 200)

Результат выполнения кода:

python"Test passed successfully"

Пример . POST-запрос

Отправим данные формы через POST и проверим, что после отправки происходит перенаправление:

pythonfrom django.test import TestCase

class ContactFormTest(TestCase):
  def test_form_submission(self):
    response = self.client.post('/contact/', data={
      'name': 'John',
      'email': 'john@example.com',
      'message': 'Hello!'
    })
    self.assertEqual(response.status_code, 302)

Результат выполнения кода:

python"Test passed successfully"

Пример . Работа с сессией

Через атрибут client можно обращаться к сессии и проверять её содержимое:

pythonfrom django.test import TestCase

class SessionTest(TestCase):
  def test_session_value(self):
    session = self.client.session
    session['user_id'] = 123
    session.save()
    
    response = self.client.get('/profile/')
    self.assertEqual(response.context['user_id'], 123)

Пример . Авторизация через клиент

Атрибут client позволяет легко авторизовать пользователя с помощью метода force_login:

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

class AuthTest(TestCase):
  def test_authenticated_user(self):
    user = User.objects.create_user(username='testuser', password='12345')
    self.client.force_login(user)
    
    response = self.client.get('/dashboard/')
    self.assertContains(response, 'Welcome, testuser')

Результат выполнения кода:

python"Test passed successfully"

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

  • класс Client,
    который используется для отправки HTTP-запросов в тестах
  • метод get,
    который выполняет GET-запрос через клиент
  • метод post,
    который выполняет POST-запрос через клиент
  • метод force_login,
    который принудительно авторизует пользователя