2016-05-01 31 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