2017-12-06 2 views
0

Edit:pytest-Kolben - nicht Applikation Endpunkte von Test-Client-Funktion zugreifen

Nach Sachen bewegen und die Umbenennung Dinge, ich bin diesen Beitrag Überarbeitung meiner aktuellen Ausgabe zu reflektieren.

Ich kann nicht auf die Endpunkte in den Dateien in meinem Ordner views zugreifen. Ich dachte, sie in test_example.py explizit zu importieren oder sie in __init__.py bereits importiert zu haben, würde den Trick machen.

Hier ist der Fehler, wenn pytest ausgeführt wird:

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? 

Auch habe ich versucht, url_for('some_endpoint') mit url_for('some_endpoint', _external=True) Substitution - hatte keine Wirkung.

Hier ist meine Verzeichnisstruktur und die vereinfachten Inhalte der relevanten Dateien:

Verzeichnisstruktur

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" 

Ich bin mit pytest-flask-0.10.0, Python 3.4.3 und Flask 0.12.2

Antwort

1

Ich denke, yo Sie sollten wirklich in Betracht ziehen, Ihre App-Struktur neu zu strukturieren. Die Art und Weise, wie Sie es tun, wird zu kreisförmigen Importen führen. Wahrscheinlich importieren Sie Ihre Ansichten nach der Erstellung Ihrer App. Ich würde vorschlagen, Ihre App-Factory in eine eigene Datei zu verschieben, da Sie sie in Ihren Tests wiederverwenden.

my_app/factory.py

def create_app(): 
    # init extensions 
    # init blueprints 
    return app 

Dann, während die App klein ist einfach die Ansichten halten in app.py Als App der Umsetzung des blueprint Design-Muster größer betrachten bekommt ->docs

my_app/app. py

from factory import create_app 

app = create_app() 

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

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

In Ihren Tests

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"' 

Miguel Grinberg hat eine wirklich große blog auf Flask er ist der Autor von Flask Web Development, die eine hervorragende Ressource ist.Sieht so aus, als wäre er dabei, sein Tutorial zu Flask zu überarbeiten.

Beispiel Riss

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() 

Hoffnung, die

hilft
Verwandte Themen