Является ли это недопустимым использованием pytest.mark.django_db?
В данном примере все в модели UserProfile является необязательным, кроме внешнего ключа user к модели user
@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?
Сделайте его fixture
и используйте метку 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):
...