django.core.exceptions.AppRegistryNotReady: приложения еще не загружены с помощью Django pytest
Я пишу тест для моего Django 2.0
приложение.
я использую mixer
и структура каталогов похожа
project
|- src
|- contacts
|- migrations
|- tests
|- __init__.py
|- test_models.py
|- __init__.py
|- models.py
|- apps.py
|- koober <---- (main app)
|- settings
|- __init__.py
|- local.py
|- production.py
|- __init__.py
|- test_settings.py
|- urls.py
|- wsgi.py
|- .coveragerc
|- manage.py
|- pytest.ini
|- other_files
|- not_related_to_project
|- Pipfile
|- Pipfile.lock
|- Procfile
Когда я бегу от project
каталог
project$ pipenv run py.test
Выдает ошибку как
============================================================================= test session starts ==============================================================================
platform linux -- Python 3.6.5, pytest-3.6.1, py-1.5.3, pluggy-0.6.0
rootdir: /home/anuj/code/python/koober, inifile:
plugins: django-3.3.0, cov-2.5.1
collected 0 items / 1 errors
==================================================================================== ERRORS ====================================================================================
______________________________________________________________ ERROR collecting src/contacts/tests/test_models.py ______________________________________________________________
src/contacts/tests/test_models.py:2: in <module>
from mixer.backend.django import mixer
../../../.local/share/virtualenvs/koober-MOd9u5HA/lib/python3.6/site-packages/mixer/backend/django.py:11: in <module>
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation # noqa
../../../.local/share/virtualenvs/koober-MOd9u5HA/lib/python3.6/site-packages/django/contrib/contenttypes/fields.py:3: in <module>
from django.contrib.contenttypes.models import ContentType
../../../.local/share/virtualenvs/koober-MOd9u5HA/lib/python3.6/site-packages/django/contrib/contenttypes/models.py:134: in <module>
class ContentType(models.Model):
../../../.local/share/virtualenvs/koober-MOd9u5HA/lib/python3.6/site-packages/django/db/models/base.py:100: in __new__
app_config = apps.get_containing_app_config(module)
../../../.local/share/virtualenvs/koober-MOd9u5HA/lib/python3.6/site-packages/django/apps/registry.py:244: in get_containing_app_config
self.check_apps_ready()
../../../.local/share/virtualenvs/koober-MOd9u5HA/lib/python3.6/site-packages/django/apps/registry.py:127: in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
E django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
=========================================================================== 1 error in 0.31 seconds ============================================================================
Когда я запускаю ту же команду из project/src
файл, он выдает ошибку как
ImportError: No module named 'koober.test_settings.py'; 'koober.test_settings' is not a package
Я проверил на любую ошибку с
project$ pipenv run python src/manage.py check
и это дает
System check identified no issues (0 silenced).
четное pipenv run python src/manage.py runserver
работает нормально.
содержание test_settings.py
from koober.settings import *
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ":memory:",
}
}
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
Обновлен test_settings.py
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "koober.settings")
django.setup()
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ":memory:",
}
}
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
содержимое pytest.ini
[pytest]
DJANGO_SETTINGS_MODULE = koober.test_settings.py
addopts = --nomigrations --cov=. --cov-report=html
содержимое src/contacts/tests/test_models.py
import pytest
from mixer.backend.django import mixer
from django.contrib.auth.models import User
pytestmark = pytest.mark.django_db
class TestContact:
def test_model(self):
user = mixer.blend(User)
Кроме того, можно увидеть в журнале pytest, файл pytest.ini не обнаруживается при запуске pytest
или же py.test
и inifile: пусто
Редактировать 3: Что работает для меня
обновлен test_settings.py
from .settings import *
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ":memory:",
}
}
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
команда работает от /src
каталог
pipenv run pytest --ds=koober.test_settings
2 ответа
Где ваша проблема INSTALLED_APPS с неправильной настройкой этого атрибута, или вы не в ярлыке вашего приложения на вашем app.py в ваших приложениях
В моем случае, после обновления до Django 1.11, это началось таинственным образом. Решение было использовать Pytest's --ds
параметр, чтобы сообщить pytest, где найти наши настройки django. Итак, наша команда пошла от:
pytest path/to/some/test.py
Для того, чтобы:
pytest --ds proj.settings path/to/some/test.py
Странно, но хорошо, теперь это работает.
Я не уверен, но может показаться, что ваш тест не импортирует приложение django вместе с его настройками должным образом. Лучший способ эмулировать это - включить (импортировать) все, что есть в manage.py,(нужно ли вам включить приложение wsgi - это другое обсуждение) перед вашим скриптом. У меня нет опыта работы с микшером, но ошибка выглядит так, как будто приложение django не загружается в правильной последовательности.
Обратитесь к этому для синтаксиса. Главное дать правильный путь сюда
os.environ.setdefault("DJANGO_SETTINGS_MODULE", correctpath)
Также укажите правильный путь к настройкам, т.е. убедитесь, что в настройках есть все необходимые вещи, такие как установленные приложения, и все другие вещи, такие как db conf, чтобы он работал, и даже если его нет, вы можете импортировать отсутствующие из рабочего файла настроек, такие как ваш локальный файл. или производственные.