2012-06-19 6 views
6

Sono abbastanza nuovo per Python, quindi mi scuso in anticipo se questo è molto rumore per qualcosa di base.Unit test a una classe di applicazione Flask

Ho una situazione simile a How do you set up a Flask application with SQLAlchemy for testing? La grande differenza per me è che a differenza della maggior parte degli altri esempi di Flask che vedo su Internet, la maggior parte del codice che ho per la mia applicazione è in una classe. Per qualche ragione, questo sta facendo sì che il mio test dell'unità non funzioni correttamente. Qui di seguito è una configurazione di base della mia applicazione e test:

di applicazione:

from Flask import Flask 

app = Flask(__name__) 

class MyApplication(): 
    def __init__(self, param1, param2): 
     app.add_url("/path/<methodParam>", "method1", self.method1, methods=["POST"]) 
     # Initialize the app 

    def getApplication(self): 
     options = # application configuration options 
     middleware = ApplicationMiddleware(app, options) 
     return middleware 

    def method1(self, methodParam): 
     # Does useful stuff that should be tested 
    # More methods, etc. 

Test Application:

import unittest 
from apppackage import MyApplication 

class ApplicationTestCase(unittest.TestCase): 

    def setUp(self): 
     self.tearDown() 
     param1 = # Param values 
     param2 = # Param values 
     # Other local setup 
     self.app = MyApplication(param1, param2).app.test_client() 

    def tearDown(self): 
     # Clean up tests 

    def test_method1(self): 
     methodParam = # Param value 
     response = self.app.post("path/methodParam") 
     assert(reponse.status_code == 200) 

Quando eseguo i miei test tramite

nosetests --with-coverage --cover-package apppackage ./test/test_application.py

I ge t il seguente errore:

param2).app.test_client() AttributeError: MyApplication instance has no attribute 'app'

Ho provato app all'interno della dichiarazione della classe in movimento, ma che non fa nulla di buono, e non come ogni altra guida unit testing che ho visto non lo è. Perché i miei test di unità non possono trovare l'attributo "app"?

+1

Come Mark ha menzionato nella sua risposta, non c'è nessun attributo app nella classe. Un attributo non appartiene a una classe a meno che non lo si colleghi usando self.attribute_name = value o definendolo prima dei metodi all'interno della classe non all'esterno. – codecool

risposta

2

Il test dell'unità non ha trovato l'attributo "app" perché MyApplication non ne ha uno. C'è un attributo "app" nel modulo in cui è definita MyApplication. Ma quelli sono due posti separati.

Forse provare quanto segue:

class MyApplication(object): 
    def __init__(self, param1, param2): 
     self.app = Flask(__name__) 
     self.app.add_url("/path/<methodParam>", "method1", self.method1, methods=["POST"]) 
     # Initialize the app 

In alternativa, è sembrano anche avere un metodo "getApplication", che non si sta realmente facendo nulla con, ma immagino che si sta utilizzando per qualcosa. Forse lo vuoi davvero nel tuo test ...

def setUp(self): 
     self.tearDown() 
     param1 = # Param values 
     param2 = # Param values 
     # Other local setup 
     self.app = MyApplication(param1, param2).getApplication().test_client()