7

私は Python にかなり慣れていないので、これが基本的なことで大騒ぎになっている場合は、事前にお詫び申し上げます。

テスト用に SQLAlchemy を使用して Flask アプリケーションをセットアップするにはどうすればよいですか? に似た状況があります。私にとっての大きな違いは、インターネットで見られる他のほとんどの 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)

経由でテストを実行すると

ノーズテスト --with-coverage --cover-package apppackage ./test/test_application.py

次のエラーが表示されます。

param2).app.test_client() AttributeError: MyApplication インスタンスに属性 'app' がありません

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

4

1 に答える 1

4

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()
于 2012-06-20T00:47:57.673 に答える