Pytest-django не разрешает доступ к базе данных даже с отметкой

Мне трудно понять, что не так с моей настройкой. Я пытаюсь проверить вид входа в систему, и независимо от того, что я пытаюсь, я продолжаю получать:

Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.

Мой тест:

import pytest

from ..models import User


@pytest.mark.django_db
def test_login(client):
    # If an anonymous user accesses the login page:
    response = client.get('/users/login/')
    # Then the server should respond with a successful status code:
    assert response.status_code == 200

    # Given an existing user:
    user = User.objects.get(username='user')
    # If we attempt to log into the login page:
    response = client.post('/users/login/', {'username': user.username, 'password': 'somepass'})
    # Then the server should redirect the user to the default redirect location:
    assert response.status_code == 302

Мой файл conftest.py в том же каталоге с тестами:

import pytest

from django.core.management import call_command


@pytest.fixture(autouse=True)
def django_db_setup(django_db_setup, django_db_blocker):
    with django_db_blocker.unblock():
        call_command('loaddata', 'test_users.json')

Мой файл pytest.ini (в котором указан правильный файл настроек Django):

[pytest]
DJANGO_SETTINGS_MODULE = config.settings

Я в тупике. Я пытался использовать scope = "session", как в документация, вместе либо с меткой @pytest.mark.django_db, либо с фикстурой db (в качестве параметра тестовой функции), либо с обоими, но безуспешно. Я прокомментировал каждую строку теста, чтобы выяснить, какая из них вызывает проблему, но не смог этого понять. Я мог бы запустить тест вообще только в том случае, если бы я удалил из теста все зависящие от БД приспособления/метки/код и получил простой assert True. Я не думаю, что проблема в моих настройках Django, так как сервер разработки работает нормально и имеет доступ к базе данных.

Что мне здесь не хватает?

Можете ли вы предоставить минимальный воспроизводимый пример?

hoefling 31.05.2019 10:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
1
5 447
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

По-видимому, это случай «синдрома обманчивого исключения». У меня была миграция, которая создавала группы с разрешениями, и, поскольку тесты запускают все миграции одновременно, сигнал после миграции, который создает разрешения, от которых зависит миграция, никогда не запускался до перехода к этой миграции.

Кажется, что если возникает какая-либо ошибка, связанная с базой данных, до того, как начнутся фактические тесты, возникает это исключение, что очень затрудняет отладку того, что именно идет не так. В итоге я обновил свой сценарий миграции, чтобы вручную создавать разрешения, чтобы миграция могла выполняться, и ошибка исчезла.

Этот ответ предоставляет альтернативное решение. Он предлагает вызвать сигнал после миграции вручную, принудительно создав разрешения при настройке теста. Таким образом, я могу избежать создания разрешений, которые уже определены Django или созданы с помощью атрибута разрешений из файла Meta модели.
Michel Sabchuk 15.09.2021 16:17

Вы можете добавить приведенный ниже код в свой conftest.py в соответствии с официальной документацией, чтобы разрешить доступ к БД без маркера django_db.

@pytest.fixture(autouse=True)
def enable_db_access_for_all_tests(db):
    pass

Ссылка: https://pytest-django.readthedocs.io/en/latest/faq.html#how-can-i-give-database-access-to-all-my-tests-without-the-django-db-marker

Другие вопросы по теме