Конечная точка Django DRF API может быть вызвана через Postman, но в pytest выдает 404 not found
В настоящее время я переписываю наши модульные тесты Django (написанные с помощью библиотеки django.unittest
) на pytest и сталкиваюсь с проблемой.
Я использую отдельный conftest.py
файл, в котором храню свои фикстуры pytest, а также загружаю свои фикстуры JSON для заполнения базы данных тестовыми данными. Один из моих методов pytest fixture создает пользователя, а другой - авторизованного клиента. Фикстура пользователя также принимает db
в качестве аргумента. В основном это базовая настройка.
Метод тестирования вызывает конечную точку, которая включает user_id
в URL. Вызов выглядит примерно так:
response = authorized_client.get(path=f"/user/{user_id}", headers=header)
Тестирование конечной точки вручную в Postman возвращает пользовательские данные и код состояния 200
. Однако pytest возвращает код состояния 404
.
User.objects.exists(id=user_id)
Это подтвердило, что пользователь существует в базе данных.
Я провел дальнейшее расследование и вызвал конечную точку, которая извлекает всех пользователей. Код user_id
, который я использовал при обращении к конечной точке, не был включен в ответ. Полагаю, именно поэтому я получаю ответ 404.
Вопрос
Почему при вызове конечной точки я получаю User.objects.exists(id=user_id)
, но пользователя с таким идентификатором на самом деле нет? Может быть, pytest обрабатывает изоляцию тестовой базы данных иначе, чем django.unittest
, так что набор представлений не может получить доступ к тестовой базе данных? Может ли это быть тем, что происходит здесь?
Я все еще новичок в pytest, поэтому не исключаю, что делаю что-то принципиально неправильно, но я не смог найти ничего об этом. Дополнительная информация
Я также попробовал вызвать набор представлений напрямую, используя что-то похожее на это:
@pytest.mark.django_db(transaction=True)
def test_viewset_direct_call(test_user):
factory = APIRequestFactory()
request = factory.get(f"/user/{test_user.id}")
view = UserViewSet.as_view({"get": "retrieve"})
response = view(request, pk=test_user.id)
assert response.status_code == 200
Это также приводит к 404 not found.
Мой pytest.fixture
для создания тестового пользователя выглядит примерно так:
@pytest.fixture
def test_user(db) -> User:
with transaction.atomic():
return User.objects.create_user(<test credentials go here>)