我很难确定我的设置出了什么问题。我正在尝试测试登录视图,无论我做什么,我都会得到:
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设置中,因为开发服务器可以正常运行并且可以访问数据库。
我在这里想念什么?
答案 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