2017-12-06 7 views
0

編集:pytestフラスコは - テスト・クライアント機能から、アプリケーションのエンドポイントにアクセスすることはできません

周りのものを移動して、物事の名前を変更した後、私は私の現在の問題を反映するために、この記事を改訂しています。

viewsフォルダ内のファイルのエンドポイントにアクセスできません。私はそれらを明示的にtest_example.pyにインポートすることを考えていたか、すでに__init__.pyにインポートされているのは、そのトリックを行うでしょう。 pytestを実行するときに

はここでエラーになります。また

rv = self._partial_build(endpoint, values, method, append_unknown) 
    if rv is None: 
>  raise BuildError(endpoint, values, method, self) 
E  werkzeug.routing.BuildError: Could not build url for endpoint '/api/create_booth'. Did you mean 'static' instead? 

、私はurl_for('some_endpoint', _external=True)url_for('some_endpoint')を代入しようとした - は効果がなかったです。

は、ここに私のディレクトリ構造だと、関連するファイルの簡素化内容:

ディレクトリ構造

server/ 
    my_app/ 
     __init__.py 
     views/ 
      __init__.py 
      some_views.py 
    test/ 
     __init__.py 
     conftest.py 
     test_example.py 

__init__.py:

from flask import Flask 

def create_app(): 
    app = Flask(__name__) 
    return app 

app = create_app() 
from views.some_view import *  

if __name__ == '__main__': 
    app.run(debug=True) 

conftest.py

import pytest 
from my_app import create_app 

@pytest.fixture 
def app(): 
    app = create_app() 
    return app 

test_example.py

from flask import url_for 
from my_app.views.some_views import some_endpoint 

def test_some_endpoint(client): 
    assert client.post(url_for('some_endpoint'), 
      data=json.dumps(dict(some_attr='some_value')), 
      content_type='application/json').status_code == 200 

some_views.py

from my_app import app 

@app.route('/api/some_endpoint/', methods=['POST']) 
def some_endpoint(): 
    return "success" 

私はヨーヨーだと思うpytest-flask-0.10.0Python 3.4.3、およびFlask 0.12.2

答えて

1

を実行していますよ本当にあなたのアプリの構造を再編成することを検討すべきです。あなたがそれをやっているところで、あなたはあなたのアプリケーションの作成後にあなたのビューをインポートしているのかもしれない、おそらく循環的なインポートにつながるでしょう。テストで再利用するので、自分のアプリケーションファクトリを独自のファイルに移動することをお勧めします。

MY_APP/factory.py
def create_app(): 
    # init extensions 
    # init blueprints 
    return app 

その後、あなたのアプリがあなたのアプリが blueprintデザインパターン実装を検討大きくなると、単純に app.pyでビューを保つ小さいながら - > docs

MY_APP /アプリを。あなたのテストではPY

from factory import create_app 

app = create_app() 

@app.route('/') 
def index(): 
    return 'hello' 

if __name__ == '__main__': 
    app.run() 

test_example.py

from factory import create_app 

@py.fixture 
def client(): 
    return create_app().test_client() 

def test_route(client): 
    response = client.get('/') 
    assert response.json() == 'hello', 'Route should return "hello"' 

ミゲルGrinbergは、彼が優れた資源であるFlask Web Developmentの著者のフラスコに本当に素晴らしいblogを持っています。彼はフラスコで彼のチュートリアルを書き直す過程にあるように見えます。

を助け

青写真例

MY_APP/factory.py

def create_app(): 
    app = Flask(__name__) 
    from main import main 
    app.register_blueprint(main) 

    return app 

MY_APP/main.py

from flask import Blueprint 

main = Blueprint('main', __name__) 

@main.route('/') 
def index(): 
    return "hello" 

MY_APP/app.py

from factory import create_app 

app = create_app() 

if __name__ == '__main__': 
    app.run() 

・ホープ

関連する問題