PyDev从辅助源文件夹导入

时间:2016-05-01 15:06:59

标签: python pydev python-unittest

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

我有两个源文件夹和四个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

1 个答案:

答案 0 :(得分:0)

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

您可以将测试源目录下的模块foo重命名为其他内容吗?与footests而不是foo一样?

相关问题