我在我的Django项目中遇到了一个问题,我在那里导入了两次相同的模块。这导致我的单元测试失败:此单元测试检查通过解析URL找到的视图是否是从正在测试的应用程序中导入的相同视图。所以,我的测试文件看起来像:
from django.core.urlresolvers import resolve
from django.tests import TestCase
from .views import index
class IndexText(TestCase):
def test_root_url_resolves_to_index_view(self):
found = resolve('/someapp/')
import pdb; pdb.set_trace() # Using this to debug because the below assertion is failing
self.assertEqual(found.func, index)
上述断言失败,因为这两个函数不相等。在pdb中进行调试时,我发现found.func.__module__
为someapp.views
而index.__module__
为projectName.someapp.views
。
我在Freenode的#django被告知这可能是因为虽然我最近更新到了Django 1.6,但我使用的是旧的1.3项目结构,其中项目settings.py和urls.py位于项目的根目录中与manage.py一起。
我已经通过在项目根目录中创建一个新目录来修复它,该目录与包含项目根目录的目录同名,并将我的urls.py和settings.py放在该目录中。所以,我的目录结构如下所示:
/home
/joseph
/myWorkspace
/projectName
manage.py
/projectName
__init__.py
urls.py
settings.py
/someapp
__init__.py
views.py
tests.py
/someotherapp
/ ... and so on ...
当我通过manage.py shell
打开一个shell,导入sys,并打印sys.path时,该列表中的第一个目录是/home/joseph/myWorkspace/projectName
,这似乎对我而言。 python路径的其余部分看起来很正常,指向不同的站点包等。
但是,当我从上面通过manage.py test someapp
运行我的测试时,如果我在pdb中打印sys.path,我看到我的python路径首先包含/home/joseph/myWorkspace
,而也是 /home/joseph/myWorkspace/projectName
。这对我来说似乎不正确,我认为这可能是我遇到双重导入问题的原因。
我没有在环境变量中设置PYTHONPATH。据我所知,我也没有在我的应用程序或设置中对sys.path进行任何调整。
我不知道从哪里开始,有人能提供一些见解吗?
答案 0 :(得分:1)
正如@Mikko Ohtamaa
提到的那样,问题是项目根目录包含__init__.py