2016-05-01 70 views
0

摘要:使用PyDev,我无法获得一个Python模块(FooTest)在同一个(测试)源文件夹中导入另一个(FooMock)。PyDev从辅助源文件夹导入

我有两个源文件夹和四个Python模块,目录结构如下。最小的示例代码在问题的末尾。虽然我提供了很多信息,但请不要让这个吓到你 - 这是一个简单的问题。

PyDevProject/ 
    src/   (source folder for prod code) 
    foo/ 
     __init__.py 
     Bar.py 
     Foo.py 
    test/  (source folder for tests) 
    foo/ 
     __init__.py 
     FooMock.py 
     FooTest.py 

这里的问题是,当我尝试导入FooTest模块中FooMock类,我得到以下错误(运行PyUnit中运行FooTest测试):

Finding files... done. 
Importing test modules ... Traceback (most recent call last): 
    File "/Applications/Eclipse.app/Contents/Eclipse/plugins/org.python.pydev_4.5.4.201601292234/pysrc/_pydev_runfiles/pydev_runfiles.py", line 468, in __get_module_from_str 
mod = __import__(modname) 
    File "/Users/me/Development/krtiWorkspace/ImportTest/test/foo/FooTest.py", line 4, in <module> 
    from foo.FooMock import FooMock 
ImportError: No module named FooMock 
ERROR: Module: FooTest could not be imported (file: /Users/me/Development/krtiWorkspace/ImportTest/test/foo/FooTest.py). 
done. 

---------------------------------------------------------------------- 
Ran 0 tests in 0.000s 

OK 

事情我已经尝试:

  • 尽管FooMock和FooTest都在同一个Python包中,但FooMock无法导入。
  • 将FooMock移动到src/目录下工作,即使放置在唯一Python包下(只要在src/下)。但这对我来说是不可接受的(在生产源文件夹中有测试代码)。
  • 我确保PyDev中的PYTHONPATH设置被设置为指定两个文件夹都是源文件夹。
  • 将FooMock代码复制并粘贴到FooTest代码中。但是这对我来说是不可接受的(因为我想在其他地方引用FooMock,在多个测试文件中,因此我不希望FooMock的多个副本随之漂浮)。

有什么我可以做的吗?

代码:

# Code for Bar.py ----------------------------------------------------- 
class Bar(object): 
    def __init__(self, foo): 
     self.foo = foo 
    def next(self): 
     self.foo.incr() 

# Code for Foo.py ----------------------------------------------------- 
class Foo(object): 
    def __init__(self): 
     self.num = 0 
    def incr(self): 
     self.num = self.num + 1 

# Code for FooMock.py ------------------------------------------------- 
class FooMock(object): 
    def mock_incr(self): 
     self.hit = True 

# Code for FooTest.py ------------------------------------------------- 
import unittest 
from foo.Foo import Foo 
from foo.Bar import Bar 
from foo.FooMock import FooMock 

class Test(unittest.TestCase): 
    def test_Foo(self): 
     foo = Foo() 
     foo.incr() 
     self.assertEquals(1, foo.num, "should be 1") 
    def test_Bar(self): 
     foo = FooMock() 
     bar = Bar(foo) 
     bar.next() 

if __name__ == "__main__": 
    unittest.main() 

目录的截图: Image showing directory structure and PYTHONPATH as previously explained

回答

0

您有一个名为您的PYTHONPATH foo两次模块。在包名foo的第一个目录中,确实没有名为FooMock的模块。

您可以将测试源目录下的模块foo重命名为其他名称吗?像footests而不是foo

+0

这是问题!在这里我假设这就像Java。菜鸟的错误。感谢@grepe。为了确认,将test/foo包重命名为test/footest使Python能够找到FooMock。 –

+0

我的问题的一个小扩展:所有的Python包必须是唯一的吗?即我可以有SRC/foo.bar和TEST/tests.foo.bar吗?无论如何我现在都在检查。 –

+0

您可以在将代码导入代码后扩展包(这称为“猴子修补”,请参阅此主题,例如:http://stackoverflow.com/questions/5626193/what-is-a -monkey贴片)。但导入方式的工作方式是它按顺序查找包含在PYTHONPATH中的每个目录中的包,一旦找到它,它就停在那里。所以如果包在路径中多次,它仅包含在第一次,只有来自第一个定义的代码被使用。 – grepe