pytest-django甚至不允许带有标记的数据库访问

时间:2019-05-31 05:37:30

标签: django pytest 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

我很困惑。我尝试像在documentation中一样使用scope="session"@pytest.mark.django_db标记,db固定装置(作为测试函数的参数)一起使用,或两者都没有运气。我已经注释掉测试的每一行,以找出是哪个触发了问题,但无法找出原因。如果我从测试中删除了所有与数据库相关的固定装置/标记/代码,并且只有一个简单的assert True,那么我只能使测试完全运行。我不认为问题出在我的Django设置中,因为开发服务器可以正常运行并且可以访问数据库。

我在这里想念什么?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我有一个非常相似的问题,@ pytest.mark.django_db没什么区别。在我的测试(setUp)中,即使在类中使用@ pytest.mark.django_db,我也运行User.objects.create_user('john',...),

Compile Error: 
Variable not defined

在另一个文件.py中:

@pytest.mark.django_db
class UserViewTests(TestCase):
    @classmethod
    def setUpClass(cls):
        super(UserViewTests, cls).setUpClass()
        print('\nUserViewTests')
        create_data()

我不知道该怎么办!伙计们,有什么想法吗?

答案 2 :(得分:0)

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