19

我确实有以下项目结构

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

看来我在这里错过了什么???

4

5 回答 5

23

因为 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 .
于 2013-03-07T20:21:04.280 回答
1

从文档中,它似乎base已经在你的路径中 - 所以也许你想使用

py.test --ds=settings.settings
于 2013-03-04T11:30:32.690 回答
1

为什么您的设置中有 3 个 "t" ?它应该是设置而不是设置

于 2013-03-04T11:34:05.460 回答
0

您在没有参数的情况下运行第二个程序,--ds=base.settings.settings而不是第一个程序。这就是错误的来源。

此外,在导入同名代码时,settings我会很想执行以下操作:

from base.settings import settings as foo
from django.conf import settings as bar
于 2013-03-04T11:34:28.033 回答
0

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

于 2017-12-15T08:05:00.900 回答