2014-03-28 8 views
6

Ich habe folgendes Layout:Wie importiere ich Pakete mit py.test richtig?

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

     test_spam.py 

Spam passiert einfach so eine Kolben-Anwendung zu sein.

Innerhalb spam.py Ich habe

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

Und das funktioniert gut - vom spamalot Verzeichnis Ich bin in der Lage python spam/spam.py

jedoch laufen, wenn ich Tests werfen in die Mischung zu starten, ist es nicht so genial.

In meiner test_spam.py Datei ich habe:

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

def test_it_fails(): 
    assert False 

Anstatt jedoch versagt, wo ich erwarten würde, es nicht auf den Import Zeile:

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

Ich kann dieses Problem beheben, indem __init__.py setzen in mein /tests Ordner, aber dann bekomme ich einen anderen ImportError:

kann ich lösen dass eine durch die Linie zu ändern: Ich breche meine Fähigkeit $ python spam/spam.py laufen

from spam.spam_on_eggs import spam_on_eggs 

Was mich testen können aber dann - weil ich

ImportError: no module named 'spam' 

Offensichtlich erhalten Ich habe eine Lücke in meinem Verständnis, wie Modulimporte funktionieren und wie py.test mit diesem System funktioniert.

Was fehlt mir?

Ist es sogar möglich, das beschriebene Layout zu haben - und sowohl py.test als auch meinen Server aus dem spamalot-Verzeichnis ausführen zu können?

Antwort

-1

py.test verwendet immer den kürzesten Verzeichnispfad mit __init__.py.

Setzen Sie eine __init__.py in spamalot und Sie können importieren.

Referenz: choosing a test layout

+1

Das würde Spamalot zu einem Modul machen, nicht? Das ist nicht wirklich, was ich suche - wenn ich meine Tests im selben Modul haben will, stecke ich sie einfach als Submodul von Spam –

+0

Auch das hat nicht wirklich funktioniert ('ImportError' auch) –

+0

Das hängt vom Superverzeichnis ab von 'spamalot'. Gibt es ein "__init __. Py"? Schaut euch den Link an. Ziehen Sie auch in Erwägung, einen Pfad zu 'sys.path' hinzuzufügen. – User