Testen von Code, für den eine Flask-App oder ein Anforderungskontext erforderlich ist

69

Ich bekomme working outside of request contextbeim Versuch, sessionin einem Test darauf zuzugreifen . Wie kann ich einen Kontext einrichten, wenn ich etwas teste, für das einer erforderlich ist?

import unittest
from flask import Flask, session

app = Flask(__name__)

@app.route('/')
def hello_world():
    t = Test()
    hello = t.hello()
    return hello

class Test:
    def hello(self):
        session['h'] = 'hello'
        return session['h']

class MyUnitTest(unittest.TestCase):
    def test_unit(self):
        t = tests.Test()
        t.hello()
Cory
quelle
6
flask.pocoo.org/docs/testing
Paulo Scardine

Antworten:

128

Wenn Sie eine Anfrage an Ihre Bewerbung stellen möchten, verwenden Sie die test_client.

c = app.test_client()
response = c.get('/test/url')
# test response

Wenn Sie Testcode wollen , die einen Anwendungskontext verwendet ( current_app, g, url_for), drücken Sie ein app_context.

with app.app_context():
    # test your app context code

Wenn Sie einen Testcode wünschen, der einen Anforderungskontext ( request, session) verwendet, drücken Sie a test_request_context.

with current_app.test_request_context():
    # test your request context code

Sowohl App- als auch Anforderungskontexte können auch manuell übertragen werden, was bei Verwendung des Interpreters hilfreich ist.

>>> ctx = app.app_context()
>>> ctx.push()

Flask-Script oder die neue Flask-CLI pushen automatisch einen App-Kontext, wenn der shellBefehl ausgeführt wird.


Flask-Testing ist eine nützliche Bibliothek, die Helfer zum Testen von Flask-Apps enthält.

tbicr
quelle
Ja, ich habe die Funktionen verpackt, die weder geroutet noch mit Flask verknüpft sind, für die Anforderungsdaten erforderlich sind;) app_app.test_request_context():und funktioniert hat.
m3nda
Tolle Zusammenfassung der verschiedenen Kontexte (Test, Anwendung, Anfrage).
Jason Strimpel
Zu app.test_request_context Ihrer Information , hier ist die Dokumentation für flask.palletsprojects.com/de/1.1.x/api/… .
Nico Cernek
Erstellt c.get ('/ test / url') automatisch einen Anforderungs- und Anwendungskontext?
Variable