2

是否nosetests以不同的方式对待具有某些名称的目录?目录是src特殊的吗?

如果我有一个源目录名为 的项目srcnosetests似乎可以正常工作。但是,如果该目录被命名为其他任何名称,则会nosetests报告一堆导入错误。

这是我所做的:

  1. 运行测试

    ~/src$ nosetests
    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.001s
    
    OK
    
  2. 重命名目录

    ~/src$ cd ..
    ~/$ mv src/ src2
    
  3. 重新运行测试

    ~/$ cd src2
    ~/src2$ nosetests
    E
    ======================================================================
    ERROR: Failure: ImportError (No module named **whatever**)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    ... etc. ...
        import **whatever**
    ImportError: No module named **whatever**
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.001s
    
    FAILED (errors=1) 
    

我无法在文档中找到有关此的任何内容。


示例:使用此目录结构:

.
|-- a
|   |-- b.py
|   `-- __init__.py
|-- __init__.py
`-- test
    |-- a
    |   |-- __init__.py
    |   `-- testb.py
    `-- __init__.py

所有__init__.py文件都是空的,内容a/b.py是:

y = 3

test/a/testb.py

import a.b
import unittest as u


class TestB(u.TestCase):

    def test1(self):
        self.assertTrue(True)

    def test2(self):
        self.assertTrue(False)

我可以可靠地重现这个问题。运行nosetests -V给出:

nosetests version 1.2.1
4

1 回答 1

3

快速解决方案是__init__.py从顶级目录中删除。另一种选择是使用相对导入,例如:替换import a.bfrom ...a import b.

这种混乱和棘手的罪魁祸首是鼻子进口商

如果您正在运行的目录nosetests是一个包,则nose不会将其添加到sys.path,否则,它将添加它(source)。然后,它向上抛出目录树并递归地应用相同的逻辑。所有受影响的文件都是一样的。这解释了为什么它不能使用__init__.py- 根目录(src2在你的情况下)不在 sys.path 中 - 这就是a找不到包的原因。

但是,这里的悬而未决的问题是:为什么它第一次使用src文件夹? src在这种情况下,文件夹位于 sys.path 上。可能会有其他答案或编辑。

查看相关问题:

于 2013-04-25T21:18:39.147 回答