Класс RequestFactory

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

Синтаксис

pythonfrom 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 запрос к представлению, которое возвращает все статьи из базы данных:

pythonfrom 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")

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

python"Test passed successfully"

Пример

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

pythonfrom 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")

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

python"Article created successfully"

Пример

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

pythonimport 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")

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

python{"id": 1, "title": "API article", "content": "JSON content"}

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

  • класс Client,
    который выполняет полноценные HTTP-запросы в тестах
  • метод RequestFactory.get,
    который создает GET-запрос для тестирования
  • метод RequestFactory.post,
    который создает POST-запрос для тестирования
  • класс TestCase,
    который предоставляет базовую функциональность для тестирования