Тестирование сервисов с помощью 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/