[英]why isn't nosetests catching what i want it to?
我正在使用学习python困难的方法第二版来教自己编程。 在练习46中,被指示做一些事情:
$ mkdir -p projects
$ cd projects/
$ mkdir skeleton
$ cd skeleton
$ mkdir bin NAME tests docs
$ touch NAME/__init__.py
$ touch tests/__init__.py
这是setup.py的内容:
尝试:从setuptools导入设置,除了ImportError:从distutils.core导入设置
config = {
'description': 'My Project',
'author': 'My Name',
'url': 'URL to get it at.',
'download_url': 'Where to download it.',
'author_email': 'My email.',
'version': '0.1',
'install_requires': ['nose'],
'packages': ['NAME'],
'scripts': [],
'name': 'projectname'
}
setup(**config)
测试/NAME_tests.py:
from nose.tools import *
import NAME
def setup():
print "SETUP!"
def teardown():
print "TEAR DOWN!"
def test_basic():
print "I RAN!"
然后安装一些软件包:
我所做的所有事情都没有大惊小怪(一旦我从Windows切换到Ubuntu)。
Zed(LPTHW的作者)然后说,您可以通过执行以下操作来测试您是否做对了所有事情:
drewverlee@ubuntu:~/projects/skeleton$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.020s
OK
drewverlee@ubuntu:~/projects/skeleton$
精彩!
但这是问题所在。 在udemy类(在线教程类)中,他将骨架复制到测试项目中(cp -r skelton foobar),并且他的操作大致...
zedscomp/projects/foobar: >>> nosetests
和zed出现类似以下错误:
ImportError:没有名为NAME的模块
所以zed去了...
grep -r "NAME" .
(这给了他)
./tests/foobar_tests.py:导入名称
然后,他解释说:“这对单元测试来说是很棒的事情,因为它们捕获了这些错误(zeds错误显然是因为他没有重命名import NAME来导入foobar)
因此,当我运行鼻子测试时(即使我也没有将NAME重命名为foobar)使它进一步复杂化时,我也没有收到该错误。 NAME ...但是当我从名字跑鼻子
drewvcomp/project/foobar/name: >>> nosetests
它运行得很好。
因此,在阅读了很多关于鼻子测试的内容之后,并没有真正看到我应该解决的问题,我只是使用删除了整个项目文件夹
rm -rf项目
并重建它。 但是没有运气,问题仍然存在。
下面的建议使我认为也许项目(以及其中的所有内容?)正在由python检查。 在这种情况下,当我在foobar中运行鼻子测试时就可以了,因为它能够导入名为NAME的模块(该模块存在于原始骨骼目录中)。
所以:
导入sys sys.path ['','/usr/local/lib/python2.7/dist-packages','/usr/local/lib/python2.7/dist-packages/projectname-0.1-py2.7。 egg','/ usr / lib / python2.7','/ usr / lib / python2.7 / plat-linux2','/ usr / lib / python2.7 / lib-tk','/ usr / lib / python2.7 / lib-old','/ usr / lib / python2.7 / lib-dynload','/ usr / local / lib / python2.7 / dist-packages','/ usr / lib / python2.7 /dist-packages'、'/usr/lib/python2.7/dist-packages/PIL'、'/usr/lib/python2.7/dist-packages/gst-0.10'、'/usr/lib/python2。 7 / dist-packages / gtk-2.0','/ usr / lib / pymodules / python2.7','/ usr / lib / python2.7 / dist-packages / ubuntu-sso-client','/ usr / lib /python2.7/dist-packages/ubuntuone-client'、'/usr/lib/python2.7/dist-packages/ubuntuone-control-panel'、'/usr/lib/python2.7/dist-packages/ubuntuone -couch','/ usr / lib / python2.7 / dist-packages / ubuntuone-installer','/ usr / lib / python2.7 / dist-packages / ubuntuone-storage-protocol','/ var / src / Django-1.3.1”,“ / usr / lib / python2.7 / dist-packages”,“ / usr / lib / python2.7 / dist-packages / wx-2.8-gtk2-unicode”]
kes! 我需要清理! 除了原始的和django之外,我真的不需要太多其他东西了(我应该在哪里安装?...)
另外,如果您希望阅读所有这些内容,那么如果您可以在本章的第6步中提供一些建议,我将永远爱您:
通过建议,我的意思是……
setup install
给我一个package.egg-info,我不知道那是什么!
我认为到目前为止,问题的最后一部分尚未得到解决:
另外,如果您希望阅读所有这些内容,那么如果您可以在本章的第6步中提供一些建议,我将永远爱您:
使用setup.py安装并使用pip卸载
在另一个关于stackoverflow的问题中有一个相关的答案 。 我认为您问题的答案就在最后。 我认为通过“使用setup.py安装”,他的意思是:
python setup.py sdist
然后,如果您的模块名为NAME,则运行:
sudo pip install NAME-0.1.tar.gz # or a similar filename in the /dist/ directory that is created
要卸载,请运行:
sudo pip uninstall NAME
我认为这是怎么回事:
他试图教两件事。
__init__.py
目录可以作为python中的模块导入。 现在在他的示例中,他创建了一个像这样的文件结构:
skeleton/
bin/
..
NAME/
__init__.py
..
tests/
__init__.py
..
docs/
..
然后,他复制此模板结构,执行以下操作:
cp -r skeleton foobar
因此您最终会得到几乎相同的结果:
foobar/
bin/
..
NAME/
__init__.py
..
tests/
__init__.py
..
docs/
..
现在您仍然有一个名为NAME
的目录,它带有__init__.py
,可以在python中导入。 因此,您的单元测试不要抱怨。
现在,根据您的猜测,他不仅复制了骨架,而且将NAME重命名为其他名称,因为他想将克隆的骨架用于新项目或其他东西。 所以他可能有更多类似的东西:
foobar/
bin/
..
someothername/
__init__.py
..
tests/
__init__.py
..
docs/
..
现在他的团结者抱怨了,因为他还没有更新import
声明。 因此,它尝试导入NAME
,但是如您所见,没有NAME
目录包含__init__.py
。
所以我想,继现场练习中,你错过了一步,他改名NAME
以somethingelse
,这就是为什么你不能以后重现。
更新:
采用:
import sys
print sys.path
和
import imp
print imp.find_module("NAME")
看看您的代码在哪里找到模块“ NAME”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.