Тестирование сервисов с помощью django-pytest: User.DoesNotExist

Я пытаюсь протестировать функции с помощью pytest. Он возвращает сообщение No tables found. В то время как я вижу вывод migrate и тестовую базу данных sqlite3.

authentication/tests/test_services.py::test_register_user - users.models.User.DoesNotExist: Пользователь, соответствующий запросу, не существует.

Мой тест:

import os

import pytest

from django.core.management import call_command
from rest_framework.test import APIClient

from users.models import User


@pytest.fixture(scope='session')
def delete_db():
    print("delete_db")
    try:
        os.remove("db_test.sqlite3")
    except Exception:
        pass


@pytest.fixture(scope='session')
def django_db_setup(delete_db, django_db_blocker):
    print("django_db_setup")
    with django_db_blocker.unblock():
        call_command('sqlflush')
    with django_db_blocker.unblock():
        call_command('migrate', '--noinput')
    yield


@pytest.fixture(autouse=True, scope='session')
# def user(data, django_db_blocker):
def user(django_db_setup, django_db_blocker):
    with django_db_blocker.unblock():
        user = User.objects.create(
            name='Test user',
            email='test@eaxmple.com',
            password='Password'
        )


@pytest.fixture(autouse=True, scope='session')
def guest_client():
    return APIClient()


@pytest.fixture(autouse=True, scope='session')
def user_client(guest_client, django_db_blocker):
    with django_db_blocker.unblock():
        client = APIClient()
        user = User.objects.get(email='test@example.com')
        response = guest_client.post('/api/v1/auth/login/', data={"email": user.email, "password": "Adminqwe1,"})
        token = str(response.json().get("access"))
        client.credentials(HTTP_AUTHORIZATION="Bearer " + token)
        return client

Создан тестовый пользователь из приспособления мой тестовый файл:

import pytest

from authentication.services import register_user


@pytest.mark.django_db()
def test_register_user(guest_client):
    data = {'email': 'test1@example.com', 'name': 'Test user', 'password': 'Adminqwe1.'}
    user = register_user(data=data)
    assert user.name == 'Test user'
    assert user.check_password('Admninqwe1.') is True

Проверенная функция:

from users.models import User


def register_user(data):
    password = data.pop("password")
    user = User.objects.create(**data)
    user.set_password(password)
    user.save()
    return user

settings_test:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db_test.sqlite3',
    }
}

pytest.ini:

[pytest]
DJANGO_SETTINGS_MODULE = config.settings_test

У меня нет идей, что не так.

Вам необходимо создать приспособление, создающее пользователя в test_db.

@pytest.fixture
def test_user(django_db_setup, django_db_blocker):
    with django_db_blocker.unblock():
        user = User.objects.create(
            name='Test user',
            email='test@example.com',
            password='Password'
        )
        user.set_password('Password')
        user.save()
    return user

Теперь вам нужно вызвать это приспособление test_user в вашей test_register_user функции следующим образом.

@pytest.mark.django_db
def test_register_user(guest_client, test_user):
    data = {'email': 'test1@example.com', 'name': 'Test user', 'password': 'Adminqwe1.'}
    user = register_user(data=data)
    assert user.name == 'Test user'
    assert user.check_password('Adminqwe1.') is True

Для получения дополнительной информации смотрите https://djangostars.com/blog/django-pytest-testing/

Вернуться на верх