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.