2014-03-28 33 views
6

我有以下佈局:如何正確導入py.test包?

/spamalot 
    /spam 
     __init__.py 
     spam.py 
     /spam_on_eggs 
      __init__.py 
      spam_on_eggs.py 
    /tests 

     test_spam.py 

垃圾郵件恰好是一個燒瓶中的應用。

spam.py

import spam_on_eggs.spam_on_eggs as eggs 
# Other Flask setup & application code here. 

而且能正常工作 - 從spamalot目錄我能夠運行python spam/spam.py

然而,當我開始投擲試驗混進去,它不是真棒。

在我test_spam.py文件我有:通過把__init__.py

/spamalot/ $ py.test 
# some output 
E ImportError 

我可以解決這個問題:

import spam.spam 
test_client = spam.spam.app.test_client() 

def test_it_fails(): 
    assert False 

然而,而不是失敗,我所期望的,它無法對進口線我的/tests文件夾,但然後我得到不同的ImportError:

spam/spam.py:1: in <module> 
> import spam_on_eggs.spam_on_eggs as eggs 
E ImportError: No module named 'spam_on_eggs' 

我可以解決一個通過改變線路:

from spam.spam_on_eggs import spam_on_eggs 

,讓我來測試然後我打破我跑$ python spam/spam.py能力 - 因爲我得到

ImportError: no module named 'spam' 

顯然我在理解模塊導入的工作原理以及py.test如何與此係統協同工作方面存在差距。

我錯過了什麼?

它甚至可以擁有我描述的佈局 - 並且能夠從spamalot目錄運行py.test和我的服務器?

回答

-1

py.test將始終使用最短的目錄路徑和__init__.py

__init__.py放入spamalot中,您可以導入spamalot.spam.spam

參考:choosing a test layout

+1

這將使火腿騎士到一個模塊中,不是嗎?這實際上並不是我正在尋找的 - 如果我想在同一個模塊中進行測試,我會將它們作爲垃圾郵件的子模塊來粘貼 –

+0

此外,實際上並沒有工作('ImportError') –

+0

這取決於超級目錄'spamalot'。有沒有'__init __。py'?看看鏈接。另外考慮添加一個路徑到'sys.path'。 – User