Django tests: клиент запрашивает пустую строку вместо объекта WSGIRequest
Я работаю над проектом django, для которого я создал приложение, используемое в других проектах. Приложение и проект имеют свой собственный репозиторий и папку.
Я хочу написать тесты, специфичные для приложения этой формы:
from django.test import TestCase
from django.urls import reverse
class SignUpTest(TestCase):
def test_my_signup_get2(self):
response = self.client.get(reverse('signup'))
self.assertEqual(response.status_code, 200)
Когда я запускаю такие тесты из папки моего приложения, генерируемый объект запроса представляет собой пустую строку, что приводит к провалу теста. В логике проекта происходит обращение к объекту request.user, который не существует в строке.
Когда я запускаю точно такие же тесты из папки проекта, где используется это приложение, объект запроса является объектом WSGIRequest и тест проходит успешно, так как request.user присутствует.
Как сделать так, чтобы запрос всегда был WSGIRequest?
Юнит-тесты всегда будут запускаться из корня вашего проекта, будь то метод Django manage.py или pytest. Пожалуйста, смотрите https://docs.djangoproject.com/en/4.0/topics/testing/overview/#running-tests-1. Вы можете гибко выбирать, какой набор тестов приложения или часть набора тестов должен быть выполнен.
Это была простая проблема в settings.py. Я не добавил одинаковые контекстные процессоры в приложение, которое я тестировал, и в проект, который использовал это приложение: context_processors.request отсутствовал.
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"OPTIONS": {
"context_processors": [
# Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this
# list if you haven't customized them:
# ...
"django.template.context_processors.request", # <= this was missing
# ...
],
},
}
]