我已经在 中进行了一些单元测试mysite/vncbrowser/tests.py
,并且可以使用以下命令运行它们:
cd mysite
python manage.py test vncbrowser
在tests.py
中,我使用以下命令导入模型类:
from vncbrowser.models import Project, Stack, Integer3D, Double3D
...并使用以下测试测试将 anInteger3D
插入自定义字段类型:
class InsertionTest(TestCase):
def test_stack_insertion(self):
s = Stack()
s.title = "Example Stack"
s.image_base = "http://foo/bar/"
s.dimension = Integer3D(x=2048, y=1536, z=460)
s.resolution = Double3D(x=5.0001, y = 5.0002, z=9.0003)
s.save()
self.assertEqual(s.id, 1)
但是,当我使用 运行测试时python manage.py test vncbrowser
,我发现源代码检查失败isinstance(value, Integer3D)
。models.py
似乎在文件中,对(在该文件前面定义的)models.py
的裸引用具有 full name ,而从测试传入的对象具有 full name 。Integer3D
vncbrowser.models.Integer3D
mysite.vncbrowser.models.Integer3D
models.py
一些调试语句的相关代码是:
class Integer3D(object):
[... elided ...]
class Integer3DField(models.Field):
def to_python(self, value):
a = Integer3D()
print >> sys.stderr, "value is %s, of type %s" % (value, type(value))
print >> sys.stderr, "but a new Integer3D instance is", type(a)
if isinstance(value, Integer3D):
print >> sys.stderr, "isinstance check worked"
return value
print >> sys.stderr, "isinstance check failed"
...产生此输出(为清楚起见,添加了一些换行符和空格):
value is <vncbrowser.models.Integer3D object at 0x22bbf90>, of type
<class 'vncbrowser.models.Integer3D'>
but a new Integer3D instance is
<class 'mysite.vncbrowser.models.Integer3D'>
isinstance check failed
我可以通过将导入更改tests.py
为:
from mysite.vncbrowser.models import Project, Stack, Integer3D, Double3D
...但我不明白为什么文件mysite
中需要资格tests.py
。在我的 django 源代码的其他地方似乎不需要它。我确定我遗漏了一些明显的东西,但也许有人可以解释一下?
(事实上,我什至不确定为什么from mysite....
导入有效,因为如果我sys.path
从该语句之前打印,它包含 path /home/mark/foo/mysite/
,但不包含/home/mark/foo/
。)
我当前的工作目录是/home/mark/foo/mysite/
当我运行python manage.py test vncbrowser
.
根据要求,我的项目布局如下:
── mysite
├── custom_postgresql_psycopg2
│ ├── base.py
│ └── __init__.py
├── __init__.py
├── manage.py
├── settings.py
├── urls.py
└── vncbrowser
├── __init__.py
├── models.py
├── tables.sql
├── tests.py
└── views.py
__init__.py
上面列出的所有文件都是空的。我正在使用 Python 2.6.5 和 Django 1.3。我在 virtualenv 中使用 Python,如果我"\n".join(sys.path)
在 tests.py 开始打印,我会得到:
/home/mark/foo/mysite
/home/mark/foo/env/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg
/home/mark/foo/env/lib/python2.6
/home/mark/foo/env/lib/python2.6/plat-linux2
/home/mark/foo/env/lib/python2.6/lib-tk
/home/mark/foo/env/lib/python2.6/lib-old
/home/mark/foo/env/lib/python2.6/lib-dynload
/usr/lib/python2.6
/usr/lib64/python2.6
/usr/lib/python2.6/plat-linux2
/usr/lib/python2.6/lib-tk
/usr/lib64/python2.6/lib-tk
/home/mark/foo/env/lib/python2.6/site-packages
更新:正如lbp的回答中所建议的,我尝试在tests.py的顶部添加以下内容:
import vncbrowser as vnc_one
import mysite.vncbrowser as vnc_two
print "vnc_one:", vnc_one.__file__
print "vnc_two:", vnc_two.__file__
...产生了输出:
vnc_one: /home/mark/foo/mysite/vncbrowser/__init__.pyc
vnc_two: /home/mark/foo/mysite/../mysite/vncbrowser/__init__.pyc