Accessing session object during Unit test of Flask application

This is what you're looking for. As it says however, you'd have to use the instantiation you create in your with statement.

with app.test_client() as c:
    with c.session_transaction() as sess:
        sess['a_key'] = 'a value'

    # once this is reached the session was stored
    result = app.test_client.get('/a_url')
    # NOT part of the 2nd context

Note that this won't work if you run your test within the scope of the with c.session_transaction() as sess statement, it needs to be run after that block.


If you want to read the session data written in your view from the test, one way is to mock the session view as a dict and verify the session in your test. Here's an example using Python's unittest.mock:

app.py

from flask import Flask, session, request

app = Flask(__name__)

app.config["SECRET_KEY"] = "my secret key"

@app.route("/", methods=["POST"])
def index():
    session["username"] = request.form["username"]
    return "Username saved in session"

test_index.py

from unittest.mock import patch
from app import app


def test_index():
    with patch("app.session", dict()) as session:
        client = app.test_client()
        response = client.post("/", data={
            "username": "test"
        })
        assert session.get("username") == "test"
        assert response.data == b"Username saved in session"

You can use any mocking solution you prefer, of course.