Ich versuche, eine Anwendung mit Pytest und einer App-Factory zu testen, aber ich kann anscheinend nicht auf das Clientsitzungsobjekt in meinen Tests zugreifen. Ich bin mir sicher, dass es irgendwo einen Zusammenhang gibt, den ich nicht dränge. Ich schiebe den App-Kontext in meine App-Appliance. Soll ich den Anfragekontext irgendwo hinschieben?Zugriff auf Flask-Test-Client-Sitzung im Pytest-Test bei Verwendung einer App-Factory
Das Folgende ist ein MWE.
mwe.py:
from flask import Flask, session
def create_app():
app = Flask(__name__)
app.secret_key = 'top secret'
@app.route('/set')
def session_set():
session['key'] = 'value'
return 'Set'
@app.route('/check')
def session_check():
return str('key' in session)
@app.route('/clear')
def session_clear():
session.pop('key', None)
return 'Cleared'
return app
if __name__ == "__main__":
mwe = create_app()
mwe.run()
conftest.py:
import pytest
from mwe import create_app
@pytest.fixture(scope='session')
def app(request):
app = create_app()
ctx = app.app_context()
ctx.push()
def teardown():
ctx.pop()
request.addfinalizer(teardown)
return app
@pytest.fixture(scope='function')
def client(app):
return app.test_client()
test_session.py:
import pytest
from flask import session
def test_value_set_for_client_request(client): # PASS
client.get('/set')
r = client.get('/check')
assert 'True' in r.data
def test_value_set_in_session(client): # FAIL
client.get('/set')
assert 'key' in session
def test_value_set_in_session_transaction(client): # FAIL
with client.session_transaction() as sess:
client.get('/set')
assert 'key' in sess
Beachten Sie, dass ru Dies funktioniert direkt, ich kann springen/setzen,/überprüfen,/löschen und es verhält sich wie erwartet. In ähnlicher Weise funktioniert der Test, der nur den Testclient zum Abrufen der Seiten verwendet, wie erwartet. Der direkte Zugriff auf die Sitzung scheint dies jedoch nicht zu tun.