Django py.test не находит модуль настроек

У меня есть следующая структура проекта

base
    __init.py
    settings
        __init__.py
        settings.py
    tests
        pytest.ini
        test_module.py

My pytest.ini выглядит следующим образом:

[pytest]
#DJANGO_SETTINGS_MODULE =base.settings.settings

Мой test_module.py выглядит следующим образом:

def test_django():
    from base.settings import settings as base_settings
    from django.conf import settings as django_settings
    assert 3==5

Когда я сейчас запускаю:

py.test

он будет запускать импорт без проблем и вызовет ошибку в assert 3==5 (как и ожидалось). Это говорит мне, что база находится на sys.path и что base.settings.settings можно импортировать.

Теперь я меняю test_module.py на:

def test_django():
    from base.settings import settings as base_settings
    from django.conf import settings as django_settings
    print django_settings.xxx
    assert 3==5

Когда я сейчас запускаю:

py.test --ds=base.settings.settings

Я получаю сообщение об ошибке:

ОШИБКА: Не удалось импортировать настройки "base.settings.settings" (есть ли он на sys.path?): Нет модуля с именем base.settings.settings.

Тот же эффект, когда я не устанавливаю параметры через командную строку, а через файл pytest.ini (раскомментируя строку).

Похоже, я что-то пропустил здесь.

Ответ 1

Так как django.conf.settings ленив, он попытается импортировать модуль настроек только при попытке получить к нему доступ. Вот почему ваш тест не сбой, когда вы просто импортируете объект настроек.

Ваша проблема уже обсуждалась здесь: https://github.com/pelme/pytest_django/issues/23

Это проблема с pytest, а не с самим pytest-django. Pytest по какой-то причине удаляет текущий каталог из sys.path. Это должно быть легко обойти его.

Решение 1:

PYTHONPATH=`pwd` py.test

Решение 2:

добавьте это в свой файл conftest.py(я предположил, что conftest.py находится в том же каталоге, что и ваши приложения):

import os
import sys

sys.path.append(os.path.dirname(__file__))

Решение 3 (если вы используете оболочку virtualenv):

При запуске нового проекта просто добавьте корневой каталог проекта в virtualenv PYTHONPATH выполнение этой строки в каталоге проекта:

add2virtualenv .

Ответ 2

Почему в ваших настройках 3 "t"? это должны быть настройки, а не настройки

Ответ 3

Из документов кажется, что base уже на вашем пути - так что, возможно, вы хотите использовать

py.test --ds=settings.settings

Ответ 4

Вы запускаете вторую программу без аргумента --ds=base.settings.settings, а не первого. Здесь появляется ошибка.

Также при импорте кода с таким же именем settings у меня возникнет соблазн сделать что-то вроде:

from base.settings import settings as foo
from django.conf import settings as bar

Ответ 5

У меня была такая же проблема. pytest -s <project_dir> отлично работает для меня.