2012-06-19 9 views
6

私はPythonの新機能です。基本的なものではあまり苦労します。Flaskアプリケーションクラスのユニットテスト

私は状況が似ているHow do you set up a Flask application with SQLAlchemy for testing?私の大きな違いは、私がインターネット上で見るほとんどの他のFlaskの例とは異なり、私のアプリケーションのために持っているほとんどのコードがクラスにあることです。何らかの理由で、これは私のユニットテストが正しく動作しない原因になります。以下は、私のアプリケーションやテストの基本的な設定です:

アプリケーション:

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. 

アプリケーションテスト:

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) 

私は

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

を経由して私のテストを実行すると、

次のエラーT:

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

私はクラス宣言内のアプリを移動しようとしたが、それは何か良いをしない、と私は見てきた他のすべてのユニットテストガイドはそれをしない方法ではありません。私の単体テストが "app"属性を見つけられないのはなぜですか?

+1

マークは、彼の答えでは、クラス内のアプリケーション属性はありません。属性は、self.attribute_name = valueを使用してアタッチしない限り、クラスに属しません。 – codecool

答えて

2

MyApplicationには「app」属性がないため、単体テストで「app」属性を見つけることができません。 MyApplicationが定義されているモジュールには「app」属性があります。しかし、それらは2つの別々の場所です。

おそらく、次の操作を試してください。

また
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 

、あなたはまた、あなたが本当にして何もしていません「getApplication」メソッドを持っているように見えるが、私はあなたが何かのためにそれを使用していることを想像してみてください。おそらくあなたは実際にあなたのテストでこれをしたいと思います...

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