python - 这是对 pytest.mark.django_db 的无效使用吗?
问题描述
对于此示例,UserProfile 模型中的所有内容都是可选的,除了用户模型的用户外键
@pytest.mark.django_db
def create_userprofile_list():
full_permissions_user, _ = get_user_model().objects.get_or_create(
username="admin_testuser",
email="admin_testuser@user.com",
is_superuser=True,
is_staff=True,
)
staff_permissions_user, _ = get_user_model().objects.get_or_create(
username="staff_testuser",
email="staff_testuser@user.com",
is_superuser=False,
is_staff=True,
)
user_permissions, _ = get_user_model().objects.get_or_create(
username="normal_testuser",
email="normal_testuser@user.com",
is_superuser=False,
is_staff=False,
)
user_list = [full_permissions_user,
staff_permissions_user,
user_permissions]
return [UserProfile.objects.get_or_create(user=user)[0] for user in user_list]
userprofile_list = create_userprofile_list()
我会在其他测试中使用 userprofile_list,但我无法让它与测试数据库一起使用。
错误如下:
userprofile/tests/test_userprofiles.py:None (userprofile/tests/test_userprofiles.py)
userprofile/tests/test_userprofiles.py:39: in <module>
userprofile_list = create_userprofile_list()
userprofile/tests/test_userprofiles.py:15: in create_userprofile_list
full_permissions_user, _ = get_user_model().objects.get_or_create(
/usr/local/lib/python3.9/site-packages/django/db/models/manager.py:85: in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
/usr/local/lib/python3.9/site-packages/django/db/models/query.py:573: in get_or_create
return self.get(**kwargs), False
...
/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py:26: in inner
return func(*args, **kwargs)
/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py:259: in cursor
return self._cursor()
/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py:235: in _cursor
self.ensure_connection()
E RuntimeError: Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.
如您所知,我将与这些用户一起运行网站测试。这是一个好方法吗?这是一种很好地使用 pytest.mark.django_db 装饰器的方法吗?
解决方案
将其设为 afixture
并django_db
在使用它的测试上使用该标记。
@pytest.fixture
def userprofile_list():
full_permissions_user, _ = get_user_model().objects.get_or_create(
username="admin_testuser",
email="admin_testuser@user.com",
is_superuser=True,
is_staff=True,
)
staff_permissions_user, _ = get_user_model().objects.get_or_create(
username="staff_testuser",
email="staff_testuser@user.com",
is_superuser=False,
is_staff=True,
)
user_permissions, _ = get_user_model().objects.get_or_create(
username="normal_testuser",
email="normal_testuser@user.com",
is_superuser=False,
is_staff=False,
)
user_list = [full_permissions_user,
staff_permissions_user,
user_permissions]
return [UserProfile.objects.get_or_create(user=user)[0] for user in user_list]
@pytest.mark.django_db
def test_something(userprofile_list):
...
推荐阅读
- jquery - 在包含在变量中的 div 元素中选择锚标记
- c++ - 为什么我的项目/VS/任务管理器都显示不同的内存使用情况?C++
- javascript - 无法找到或构建 blob:预期可附加,得到 #
- html - 如何读取 DATABASES 并将其修改为 HTML 文件?
- javascript - 使用 nightwatch.js 导航上下文菜单?
- qt - QKeyEvent.nativeModifiers() 是什么?
- html - 当 Webview 重定向到 Flutter 中的另一个页面时获取 Json 响应
- r - Shiny DT 回调帮助 - 向 DT 添加交互式刻度/交叉
- ios - 使用 NSUserDefaults 阅读 SharedPreference 以了解颤振
- c++ - 指向基本虚拟成员函数的指针