【问题标题】:pytest-django won't allow database access even with mark即使使用标记,pytest-django 也不允许数据库访问
【发布时间】:2019-05-31 05:37:29
【问题描述】:

我很难弄清楚我的设置出了什么问题。我正在尝试测试登录视图,无论我尝试什么,我都会得到:

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" 中的documentation 以及@pytest.mark.django_db 标记、db 夹具(作为测试函数的参数),或者两者都没有运气。我已经注释掉了测试的每一行,以确定是哪一行触发了问题,但无法弄清楚。如果我从测试中删除所有依赖于 db 的固定装置/标记/代码并有一个简单的assert True,我只能让测试运行。我不认为问题出在我的 Django 设置中,因为开发服务器运行良好并且能够访问数据库。

我在这里错过了什么?

【问题讨论】:

标签: django pytest pytest-django


【解决方案1】:

显然这是一个“欺骗异常综合症”的案例。我有一个创建具有权限的组的迁移,并且由于测试一次运行所有迁移,因此在进行迁移之前从未运行过创建迁移所依赖的权限的迁移后信号。

似乎如果在实际测试开始运行之前出现任何与数据库相关的错误,则会引发此异常,这使得很难准确调试出问题所在。我最终更新了我的迁移脚本以手动创建权限,以便迁移可以运行,并且错误消失了。

【讨论】:

  • This answer provides an alternative solution。它建议手动调用迁移后信号,强制在测试设置中创建权限。这样我可以避免创建已经由 Django 定义的权限,或者通过模型 Meta 中的权限属性创建的权限。
【解决方案2】:

您可以根据官方文档在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

【讨论】:

    猜你喜欢
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2012-05-28
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多