2012-06-19 26 views
6

Soy bastante nuevo en Python, así que mis disculpas de antemano si esto es mucho ruido para algo básico.Unidad probando una clase de aplicación Flask

Tengo una situación similar a How do you set up a Flask application with SQLAlchemy for testing? La gran diferencia para mí es que a diferencia de la mayoría de los ejemplos de Flask que veo en Internet, la mayoría del código que tengo para mi aplicación es de una clase. Por alguna razón, esto está causando que las pruebas de mi unidad no funcionen correctamente. A continuación se muestra una configuración básica de mi solicitud y las pruebas:

aplicación:

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. 

pruebas de aplicación:

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) 

Cuando ejecuto mis pruebas a través de

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

I ge t el siguiente error:

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

He tratado de aplicación dentro de la declaración de la clase en movimiento, pero eso no hace ningún bien, y no cómo cada otro guía de la unidad de pruebas que he visto hace es. ¿Por qué mis pruebas unitarias no pueden encontrar el atributo "aplicación"?

+1

Como Mark ha mencionado en su respuesta, no hay ningún atributo de aplicación en la clase. Un atributo no pertenece a una clase a menos que lo adjuntemos utilizando self.attribute_name = value o lo definamos antes de los métodos dentro de la clase que no está fuera. – codecool

Respuesta

2

La prueba de su unidad no puede encontrar el atributo "aplicación" porque MyApplication no tiene uno. Hay un atributo de "aplicación" en el módulo donde se define MyApplication. Pero esos son dos lugares separados.

Tal vez pruebe lo siguiente:

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 

Como alternativa, también parecen tener un método "getApplication", que realmente no estás haciendo nada con, pero me imagino que se está usando para algo. Quizás realmente desee esto en su prueba ...

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