You tests are imported during the nose test discovery process. After discovery nose created the fixtures and so runs the setup/teardown. But as your test_mod_1 was imported before (during the discovery), it ended up importing app when it was still None.
So, inside your test_mod_1 app is actually None, it only changed inside the __init__. You can place your application inside a mutable object, so that you can import the object and then set/get the application from it inside the fixture and the tests. On Wed, Apr 9, 2014 at 8:38 PM, Rob <[email protected]> wrote: > Dear List.... > > I have a tg2.3 application with multiple (+300, and counting) working > tests in place. > > The `TestController` generated by quickstart provides a perfectly sound > methodology for testing the full stack. And, quite correctly, the > TestController's setup/teardown does just that -- it creates/destroys the > application environment and the entire database each time and calls > websetup/ and subsequently all of its bootstrapped data. (I'm using > postgres and many of the model objects use postgres specific field types eg > ranges -- consequently I'm unable to use an in-memory sqlite for the test > env and any speed improvements that that would bring) > > class MyTestController(TestController): > def test_a(self): > ... > def test_b(self): > ... > > As per the above, by ('naively') sub-classing `TestController`, for each > test method it contains, the entire application gets setup/torn down and > this starts to get rather time-consuming... > > I should quickly add here that I'm entirely aware that for the purist, > 'testing methodology' requires a clean slate each time -- for my purposes, > however, I'm comfortable that a dozen or so json callbacks in a > sub-controller do not require the entire stack to be set up each time. So, > to try to speed this up, I have a boilerplate test module which looks as > follows: > > from myproject.tests import load_app, setup_app, setup_db, teardown_db > from myproject import model > > app = None > environ = {'REMOTE_USER': 'X'} > > def setup(): > global app > app = load_app('main_without_authn') > setup_app() > > def teardown(): > model.DBSession.remove() > teardown_db() > > def test_a(): > resp = app.get('/a/aa', extra_environ=environ) > ok_() > > def test_b(): > resp = app.get('/b/bb', extra_environ=environ) > ok_() > > The methodology above works absolutely fine for my purposes: once per > module, the 'app' and the database get set up and the static/test data > required for my tests gets bootstrapped. (so far, so good...) > > In order to try and refine this further, I'm trying to use nosetests' > "package-level setup". (as per > http://nose.readthedocs.org/en/latest/writing_tests.html). > In a nutshell, the setup/teardown would be done in the __init__ and each > module would "from . import app", ie something like: > > __init__.py > -------------- > > app = None > > def setup(): > global app > app = load_app('main_without_authn') > setup_app() > > def teardown(): > model.DBSession.remove() > teardown_db() > > test_mod_1.py > --------------- > > from . import app > > def test_a(): > resp = app.get('/a/aa', extra_environ=environ) > ok_() > > The problem with this is that I get: > resp = app.get(....) > AttributeError: 'NoneType' object has no attribute 'get' > > In other words, it seems that I'm unable to successfully hang onto > 'app'.... > > Can anyone out there suggest how this might be done?? > > Many thanks, > Rob > > (I've just noticed this exchange from some time ago in this mailing list: > > https://groups.google.com/forum/#!searchin/turbogears/test/turbogears/JWEI06zzsh8/KHGY11EASYEJ > But it seems to deal with module-level tests rather than one level up... ) > > -- > You received this message because you are subscribed to the Google Groups > "TurboGears" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/turbogears. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "TurboGears" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/turbogears. For more options, visit https://groups.google.com/d/optout.

