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

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

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

Мой 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 (раскомментировав строку).

Кажется, я что-то пропустил???


person schacki    schedule 04.03.2013    source источник


Ответы (5)


Поскольку 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):

Когда вы начинаете новый проект, просто добавьте корневой каталог проекта в PYTHONPATH virtualenv, выполнив эту строку в каталоге вашего проекта:

add2virtualenv .
person Rafal Es    schedule 07.03.2013
comment
py.test не удаляет текущий каталог из sys.path, это поведение python: при выполнении скрипта (в данном случае py.test) каталог скрипта добавляется в sys.path. При интерактивном выполнении текущий рабочий каталог добавляется в sys.path. - person flub; 19.03.2013

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

py.test --ds=settings.settings
person danodonovan    schedule 04.03.2013

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

person random    schedule 04.03.2013
comment
Спасибо, что поймали тип. Но, к сожалению, это не было первопричиной. - person schacki; 04.03.2013

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

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

from base.settings import settings as foo
from django.conf import settings as bar
person Awalias    schedule 04.03.2013
comment
Я включил вашу вторую рекомендацию. Но я не понимаю ваш первый комментарий? - person schacki; 04.03.2013
comment
в вопросе вы говорите, когда я сейчас бегу: py.test но потом во второй раз вы говорите, когда я сейчас бегу: py.test --ds=base.settings.settings. Это опечатка? Если нет, то проблема может быть вызвана флагом ds. - person Awalias; 04.03.2013
comment
Нет, это не опечатка, а именно то, что я хотел показать. Мне нужно где-то указать свои настройки, и для этого примера я выбрал флаг ds. И как только я устанавливаю это, я получаю сообщение об ошибке. В первом примере я хочу только продемонстрировать, что мои настройки доступны через путь python. Итак, с одной стороны, мои настройки находятся на пути python. Но с другой стороны, как только я их указываю, их нельзя найти? - person schacki; 04.03.2013

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

person Andrew    schedule 15.12.2017