РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
781 of 818 menu

Класс AsyncRequestFactory

Класс AsyncRequestFactory предназначен для создания асинхронных HTTP-запросов в тестовой среде Django. Он позволяет имитировать GET, POST, PUT, DELETE и другие типы запросов, возвращая объект запроса, который можно напрямую передать асинхронному представлению. Основное отличие от синхронного RequestFactory заключается в поддержке асинхронных операций и работе с ASGIRequest объектами.

Синтаксис

from django.test import AsyncRequestFactory factory = AsyncRequestFactory() request = factory.get(path, data, content_type, **extra) request = factory.post(path, data, content_type, **extra) request = factory.put(path, data, content_type, **extra) request = factory.delete(path, data, content_type, **extra) request = factory.patch(path, data, content_type, **extra) request = factory.head(path, data, content_type, **extra) request = factory.options(path, data, content_type, **extra)

После создания запроса его можно передать асинхронному представлению, которое должно быть вызвано с ключевым словом await. Полученный ответ можно проверять с помощью стандартных утверждений Django TestCase.

Пример . Создание GET запроса

Рассмотрим базовый пример создания асинхронного GET запроса к представлению, которое возвращает список статей:

from django.test import AsyncRequestFactory, TestCase from myapp.views import article_list class ArticleViewTests(TestCase): async def test_get_articles(self): factory = AsyncRequestFactory() request = factory.get('/api/articles/') response = await article_list(request) self.assertEqual(response.status_code, 200) self.assertContains(response, 'article')

Пример . Создание POST запроса с данными

Создадим POST запрос для добавления новой статьи, передавая данные в формате JSON:

from django.test import AsyncRequestFactory, TestCase from myapp.views import create_article import json class ArticleCreateTests(TestCase): async def test_post_article(self): factory = AsyncRequestFactory() data = { 'title': 'New Article', 'content': 'Content of new article', 'status': 'draft' } request = factory.post( '/api/articles/', data=json.dumps(data), content_type='application/json' ) response = await create_article(request) self.assertEqual(response.status_code, 201) self.assertContains(response, 'New Article')

Пример . Создание запроса с дополнительными заголовками

Передадим дополнительные HTTP-заголовки для авторизации и указания предпочтительного формата ответа:

from django.test import AsyncRequestFactory, TestCase from myapp.views import user_profile class UserProfileTests(TestCase): async def test_profile_with_auth(self): factory = AsyncRequestFactory() request = factory.get( '/api/profile/', HTTP_AUTHORIZATION='Bearer token123', HTTP_ACCEPT='application/json' ) response = await user_profile(request) self.assertEqual(response.status_code, 200) self.assertEqual(response['Content-Type'], 'application/json')

Пример . Работа с асинхронным middleware

AsyncRequestFactory позволяет тестировать асинхронные middleware, передавая запрос через цепочку обработчиков:

from django.test import AsyncRequestFactory, TestCase from django.core.handlers.asgi import ASGIHandler from myapp.middleware import async_logger_middleware from myapp.views import home_view class MiddlewareTests(TestCase): async def test_async_middleware(self): factory = AsyncRequestFactory() request = factory.get('/home/') response = await async_logger_middleware(home_view)(request) self.assertEqual(response.status_code, 200) self.assertTrue(hasattr(request, 'logger'))

Пример . Тестирование обработки ошибок

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

from django.test import AsyncRequestFactory, TestCase from myapp.views import update_article class ArticleUpdateTests(TestCase): async def test_update_with_invalid_data(self): factory = AsyncRequestFactory() invalid_data = {'status': 'invalid_status'} request = factory.patch( '/api/articles/1/', data=invalid_data, content_type='application/json' ) response = await update_article(request, pk=1) self.assertEqual(response.status_code, 400) self.assertContains(response, 'Invalid status')

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

  • класс AsyncClient,
    который предоставляет клиент для асинхронных запросов
  • класс RequestFactory,
    который создаёт синхронные тестовые запросы
  • класс Client,
    который эмулирует полноценный браузер для тестирования
  • класс TestCase,
    который предоставляет базовый класс для тестов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить