いくつかの単体テストを に入れましたmysite/vncbrowser/tests.py
。これらを次のように実行できます。
cd mysite
python manage.py test vncbrowser
ではtests.py
、モデル クラスを次のようにインポートします。
from vncbrowser.models import Project, Stack, Integer3D, Double3D
...そして、Integer3D
次のようなテストでカスタム フィールド タイプへの の挿入をテストします。
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
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
/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 を使用しています。tests.py"\n".join(sys.path)
の開始時に出力すると、次のようになります。
/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's answerで提案されているように、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