Django py.test找不到设置模块

时间:2013-03-04 10:44:46

标签: python django pytest

我确实有以下项目结构

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文件(通过取消注释该行)时,效果相同。

看起来我想念这里的东西???

5 个答案:

答案 0 :(得分:20)

因为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 .

答案 1 :(得分:1)

为什么你的设置中有3个“t”? 它应该是设置而不是设置

答案 2 :(得分:0)

From the docs,似乎base已经在你的路径中 - 所以也许你想要使用

py.test --ds=settings.settings

答案 3 :(得分:0)

你运行没有--ds=base.settings.settings参数的第二个程序而不是第一个程序。这是错误似乎来自的地方。

同样在导入同名settings的代码时,我很想做类似的事情:

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

答案 4 :(得分:0)

我有同样的问题。 pytest -s <project_dir>对我来说很好。