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, чтобы он работал, и даже если его нет, вы можете импортировать отсутствующие из рабочего файла настроек, такие как ваш локальный файл. или производственные.

Другие вопросы по тегам