2016-04-22 13 views
1

私は簡単なフラスコアプリケーションのテストを書こうとしています。プロジェクトの構造は以下の通りです:フラスコテスト - なぜテストが失敗するのですか?

app/ 
    static/ 
    templates/ 
    forms.py 
    models.py 
    views.py 
migrations/ 
config.py 
manage.py 
tests.py 

tests.py

import unittest 
from app import create_app, db 
from flask import current_app 
from flask.ext.testing import TestCase 

class AppTestCase(TestCase): 
    def create_app(self): 
     return create_app('test_config') 

    def setUp(self): 
     db.create_all() 

    def tearDown(self): 
     db.session.remove() 
     db.drop_all() 

    def test_hello(self): 
     response = self.client.get('/') 
     self.assert_200(response) 

アプリ/ のinitの.py

# app/__init__.py 

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 
from config import config 

db = SQLAlchemy() 

def create_app(config_name): 
    app = Flask(__name__) 
    app.config.from_object(config[config_name]) 
    db.init_app(app) 
    return app 

app = create_app('default') 

from . import views 

を私がテストを起動すると、test_helloはresponse.status_codeので失敗します私に教えてください。どうすればいいですか?それは、アプリインスタンスは、views.pyのビュー機能について何も知らないようです。コード全体が必要な場合はhere

答えて

1

views.pyファイル__init__.pyファイルに作成されたappのルートをマウントしてください。

create_appテスト方法では、作成したアプリにこれらのルートをバインドする必要があります。

依存関係を逆転させることをお勧めします。 views.pyがコードをインポートする代わりにinit_appをインポートし、__init__.pyまたはテストファイルから呼び出すことができます。

# views.py 
def init_app(app): 
    app.add_url_rule('/', 'index', index) 
    # repeat to each route 

Blueprintを使用すると、それよりも優れた処理を行うことができます。

def init_app(app): 
    app.register_blueprint(blueprint) 

この方法で、あなたのテストファイルは、ちょうどこのinit_appをインポートし、テストappオブジェクトに青写真をバインドすることができます。

+0

私が青写真を使用する場合、私のケースでは青写真をcreate_app関数の中に登録するほうが良いでしょうか? – Stright

+0

はい、青写真はフラスコのルートを処理する最善の方法です – iurisilvio

+0

ありがとうございました! – Stright

関連する問題