Question

I have the following layout:

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

        test_spam.py

Spam just so happens to be a flask application.

Within spam.py I have

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

And this works fine - from the spamalot directory I'm able to run python spam/spam.py

However, when I start to throw tests into the mix, it's not as awesome.

In my test_spam.py file I have:

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

def test_it_fails():
     assert False

However, rather than failing where I would expect, it fails on the import line:

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

I can fix this by putting __init__.py in my /tests folder, but then I get a different ImportError:

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

I can solve that one by changing the line to:

from spam.spam_on_eggs import spam_on_eggs

Which allows me to test but then I break my ability to run $ python spam/spam.py - because I get

ImportError: no module named 'spam'

Obviously I have a gap in my understanding of how module imports work and how py.test works with this system.

What am I missing?

Is it even possible to have the layout I've described - and be able to run both py.test and my server from the spamalot directory?

Was it helpful?

Solution

py.test will always use the shortest directory path with an __init__.py in it.

Put a __init__.py into spamalot and you can import spamalot.spam.spam.

Reference: choosing a test layout

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top