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
这一行报错(这是预期的结果)。这说明 base
已经在 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 个回答
为什么你的设置里有三个“t”?应该是“settings”,而不是“setttings”。
根据文档的内容,base
似乎已经在你的路径中,所以你可能想要使用
py.test --ds=settings.settings
因为django.conf.settings是懒加载的,它只有在你尝试访问它的时候才会去导入设置模块。这就是为什么当你只是导入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 wrapper):
当你开始一个新项目时,只需通过在项目目录下执行这一行,将项目的根目录添加到virtualenv的PYTHONPATH中:
add2virtualenv .