Конечная точка 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>)
Вернуться на верх