Класс AsyncClient

Класс AsyncClient предназначен для асинхронного тестирования Django-приложений. Он имитирует браузерный запрос и позволяет выполнять GET, POST, PUT, PATCH, DELETE и другие HTTP-методы в асинхронном режиме. Основное отличие от синхронного Client заключается в том, что все методы AsyncClient являются асинхронными и требуют использования ключевого слова await при вызове. Этот класс удобно использовать при тестировании асинхронных представлений (ASGI-приложений) или при написании асинхронных тестов.

Синтаксис

pythonfrom django.test import AsyncClient

client = AsyncClient()
response = await client.get('/path/')

Пример . Тестирование GET-запроса

Выполним GET-запрос к главной странице и проверим код ответа:

pythonfrom django.test import AsyncClient, TestCase

class HomePageTest(TestCase):
  async def test_homepage_status(self):
    client = AsyncClient()
    response = await client.get('/')

    self.assertEqual(response.status_code, 200)

Пример . Тестирование POST-запроса

Отправим POST-запрос с данными формы и проверим результат:

pythonfrom django.test import AsyncClient, TestCase

class LoginTest(TestCase):
  async def test_user_login(self):
    client = AsyncClient()
    response = await client.post('/login/', {
      'username': 'john',
      'password': 'secret'
    })

    self.assertEqual(response.status_code, 302)

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

python"User successfully logged in"

Пример . Работа с заголовками

Добавим пользовательские заголовки в запрос:

pythonfrom django.test import AsyncClient, TestCase

class APITest(TestCase):
  async def test_api_with_headers(self):
    client = AsyncClient()
    response = await client.get(
      '/api/data/',
      headers={
        'X-Requested-With': 'XMLHttpRequest',
        'Authorization': 'Bearer token123'
      }
    )

    self.assertEqual(response.status_code, 200)

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

python"Request processed successfully"

Пример . Использование в асинхронном тестовом классе

Используем AsyncClient в тестовом классе с асинхронным методом:

pythonfrom django.test import AsyncClient, TransactionTestCase

class AsyncViewTest(TransactionTestCase):
  async def test_async_response(self):
    client = AsyncClient()
    response = await client.get('/async/')

    self.assertEqual(response.status_code, 200)
    self.assertContains(response, "Hello, World!")

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

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