2012-06-19 10 views
6

Jestem całkiem nowa w Pythonie, więc z góry przepraszam, jeśli jest to zbyt wzruszające dla czegoś podstawowego.Jednostka testująca aplikację aplikacji Flask klasa

Mam sytuację podobną do How do you set up a Flask application with SQLAlchemy for testing? Największą różnicą jest dla mnie to, że w przeciwieństwie do większości innych przykładów Flas, które widzę w Internecie, większość kodu, który mam dla mojej aplikacji, jest w klasie. Z jakiegoś powodu powoduje to, że moje testy jednostkowe nie działają poprawnie. Poniżej znajduje się podstawowa konfiguracja mojej aplikacji i testów:

Zastosowanie:

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. 

badania aplikacyjne:

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) 

Gdy uruchomię moich testów poprzez

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

I ge t następujący błąd:

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

Próbowałem poruszający aplikację wewnątrz deklaracji klasy, ale to nie ma nic dobrego, a nie jak każdy inny przewodnik testowanie jednostkowe Widziałem to robi to. Dlaczego moje testy jednostkowe nie mogą znaleźć atrybutu "aplikacja"?

+1

Jak zaznaczył Mark w swojej odpowiedzi, w klasie nie ma atrybutu aplikacji. Atrybut nie należy do klasy, chyba że dołączymy go za pomocą self.attribute_name = value lub zdefiniujemy go przed metodami wewnątrz klasy, a nie na zewnątrz. – codecool

Odpowiedz

2

Twój test jednostki nie może znaleźć atrybutu "aplikacja", ponieważ MyApplication go nie ma. W module, w którym zdefiniowano MyApplication, znajduje się atrybut "app". Ale to są dwa oddzielne miejsca.

Może spróbuj wykonać następujące czynności:

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 

Alternatywnie, możesz także zdają się mieć „getApplication” metody, które nie są naprawdę robi nic z, ale wyobrażam sobie, że używasz go do czegoś. Być może chcesz tego w swoim teście ...

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