2017-10-09 7 views
0

pytestを使用してFlaskアプリケーションの単体テストを作成しようとしています。私は(私に語っこれをグーグルでFlaskテストクライアントのURLを生成する

RuntimeError: Attempted to generate a URL without the application context being pushed. This has to be executed when application context is available. 

def create_app(): 
    from flask import Flask 
    app = Flask(__name__) 
    app.config.from_object('config') 
    import os 
    app.secret_key = os.urandom(24) 
    from models import db 
    db.init_app(app) 
    return app 

とテストクラス:私は、アプリの工場持って

class TestViews(object): 

    @classmethod 
    def setup_class(cls): 
     cls.app = create_app() 
     cls.app.testing = True 
     cls.client = cls.app.test_client() 

    @classmethod 
    def teardown_class(cls): 
     cls.app_context.pop() 

    def test_create_user(self): 
     """ 
     Tests the creation of a new user. 
     """ 
     view = TestViews.client.get(url_for('create_users')).status_code == 200 

をしかし、私は私のテストを実行したときに、私は次のエラーを取得します)、テストクライアントを使用すると自動アプリケーションコンテキストを作成する必要があります。私は何が欠けていますか?

答えて

1

テストクライアントでリクエストを作成すると、実際に(間接的に)アプリコンテキストがプッシュされます。しかし、url_forが視覚的にテストリクエストの中に入っているということは、実際に内部で呼ばれているという考えで混乱しています。最初にurl_forコールが評価され、結果はclient.getに渡されます。

url_forは内アプリのURL を生成するために、ユニットテストは、外部であるが典型的です。通常は、テストするURLを生成するのではなく、要求に正確に記述するだけです。

self.client.get('/users/create') 

実際にurl_forを使用する場合は、アプリコンテキストで行う必要があります。アプリケーションコンテキストではあるがリクエストコンテキストではないときは、SERVER_NAME設定を設定し、_external=Falseを渡す必要があることに注意してください。しかし、やはり、おそらく、テストしようとしているURLを書き留めておくべきでしょう。

app.config['SERVER_NAME'] = 'localhost' 

with self.app.app_context(): 
    url = url_for(..., _external=False) 

self.client.get(url, ...) 
関連する問題