在Flask应用程序的单元测试期间访问会话对象

mrs*_*n22 2 python session flask

我知道可以使用session_transaction()方法创建会话对象。但是,有没有办法访问当前会话对象,例如当“ /”路由被命中时创建的会话对象?我确实from flask import session访问了该会话,但是它是空的。让我知道是否可能。谢谢。

All*_*ter 5

就是您要寻找的。就像它说的那样,您必须使用在with语句中创建的实例化。

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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在with c.session_transaction() as sess语句范围内运行测试,则此方法将无效,它需要该代码段之后运行。

  • 对于像我这样浏览了文档中最重要的一行的人来说:您需要在事务块之后运行测试的原因是因为对“session”对象所做的修改仅在以下情况下写回实际客户端的会话:交易已关闭。 (2认同)

Mad*_*Air 5

如果您想从测试中读取写入视图中的会话数据,一种方法是将会话视图模拟为 dict 并在测试中验证会话。这是使用Python 的 unittest.mock的示例:

应用程序

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"
Run Code Online (Sandbox Code Playgroud)

测试索引.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"
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用任何您喜欢的模拟解决方案。