Thanks a million, Alessandro.  It took me a while to get my head around 
this but thank you for pointing me in the right direction.

For anyone else who bumps into this:

tests.functional.__init__

from myproject.tests import load_app, setup_app, teardown_db
from myproject.model import DBSession

class PackageApp(object):
    app = None

App = PackageApp()

def setup():
    App.app = load_app('main_without_authn')
    setup_app()

def teardown():
    DBSession.remove()
    teardown_db()


tests.functional.test_mod1

from . import App

def test_a():
    resp = App.app.get('/a/aa', extra_environ={'REMOTE_USER':'X'})
    ok_(...)



On Wednesday, 9 April 2014 20:28:24 UTC+1, Alessandro Molina wrote:
>
> 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] <javascript:>>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] <javascript:>.
>> To post to this group, send email to [email protected]<javascript:>
>> .
>> 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.

Reply via email to