Класс RequestFactory
Класс RequestFactory применяется в тестах Django для
создания объектов запроса, которые можно передавать в представления
напрямую. Это позволяет тестировать логику представлений
в изоляции, без необходимости запускать тестовый сервер
и выполнять полноценные HTTP-запросы. Класс предоставляет
методы для создания GET, POST, PUT, PATCH, DELETE запросов
и других HTTP-методов.
Синтаксис
from django.test import RequestFactory
factory = RequestFactory()
request = factory.get(path, data=None, **extra)
request = factory.post(path, data=None, content_type=None, **extra)
request = factory.put(path, data=None, content_type=None, **extra)
request = factory.patch(path, data=None, content_type=None, **extra)
request = factory.delete(path, data=None, **extra)
Пример
Давайте создадим GET запрос к представлению, которое возвращает все статьи из базы данных:
from django.test import RequestFactory, TestCase
from myapp.views import article_list
from myapp.models import Article
class ArticleViewTest(TestCase):
def setUp(self):
Article.objects.create(title="First article", status="published")
Article.objects.create(title="Second article", status="draft")
def test_article_list_view(self):
factory = RequestFactory()
request = factory.get("/articles/")
response = article_list(request)
self.assertEqual(response.status_code, 200)
self.assertContains(response, "First article")
self.assertNotContains(response, "Second article")
Результат выполнения кода:
"Test passed successfully"
Пример
Создадим POST запрос для добавления новой статьи через представление, используя данные формы:
from django.test import RequestFactory, TestCase
from myapp.views import create_article
from myapp.models import Article
class CreateArticleTest(TestCase):
def test_create_article_post(self):
factory = RequestFactory()
data = {
"title": "New article",
"content": "Article content",
"status": "published"
}
request = factory.post("/articles/create/", data)
response = create_article(request)
self.assertEqual(response.status_code, 302)
self.assertEqual(Article.objects.count(), 1)
article = Article.objects.first()
self.assertEqual(article.title, "New article")
Результат выполнения кода:
"Article created successfully"
Пример
Используем параметр content_type для отправки
JSON данных в POST запросе:
import json
from django.test import RequestFactory, TestCase
from myapp.views import api_article
class ApiArticleTest(TestCase):
def test_api_post_json(self):
factory = RequestFactory()
json_data = json.dumps({
"title": "API article",
"content": "JSON content"
})
request = factory.post(
"/api/articles/",
json_data,
content_type="application/json"
)
response = api_article(request)
self.assertEqual(response.status_code, 201)
self.assertEqual(response.json()["title"], "API article")
Результат выполнения кода:
{"id": 1, "title": "API article", "content": "JSON content"}
Смотрите также
-
класс
Client,
который выполняет полноценные HTTP-запросы в тестах -
метод
RequestFactory.get,
который создает GET-запрос для тестирования -
метод
RequestFactory.post,
который создает POST-запрос для тестирования -
класс
TestCase,
который предоставляет базовую функциональность для тестирования