Мне трудно понять, что не так с моей настройкой. Я пытаюсь проверить вид входа в систему, и независимо от того, что я пытаюсь, я продолжаю получать:
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, так как сервер разработки работает нормально и имеет доступ к базе данных.
Что мне здесь не хватает?
По-видимому, это случай «синдрома обманчивого исключения». У меня была миграция, которая создавала группы с разрешениями, и, поскольку тесты запускают все миграции одновременно, сигнал после миграции, который создает разрешения, от которых зависит миграция, никогда не запускался до перехода к этой миграции.
Кажется, что если возникает какая-либо ошибка, связанная с базой данных, до того, как начнутся фактические тесты, возникает это исключение, что очень затрудняет отладку того, что именно идет не так. В итоге я обновил свой сценарий миграции, чтобы вручную создавать разрешения, чтобы миграция могла выполняться, и ошибка исчезла.
Вы можете добавить приведенный ниже код в свой conftest.py
в соответствии с официальной документацией, чтобы разрешить доступ к БД без маркера django_db
.
@pytest.fixture(autouse=True)
def enable_db_access_for_all_tests(db):
pass
Можете ли вы предоставить минимальный воспроизводимый пример?