Flask测试问题:修改会话用于下一次请求时购物车未更新
解决Flask购物车测试会话未更新的问题
嘿,哥们儿,你这问题我太熟了——你在session_transaction上下文里发起新请求的操作,直接搞乱了会话的状态同步!
问题根源
Flask的session_transaction是用来在请求外部直接操作会话的上下文管理器,它会锁定会话进行修改,直到上下文退出才会把变更保存。但你在这个上下文里调用了client.get("/"),这个请求会创建一个全新的请求上下文和会话实例,等于同时开了两个会话事务,导致你之前修改的会话状态根本没被正确持久化。
修正后的测试代码
把请求操作移出session_transaction上下文,确保每次会话操作和请求都是独立的:
# 设置购物车:在会话事务里初始化购物车 with client.session_transaction() as sess: sess["cart"] = [1, 2] # 发起移除商品的请求:这一步会触发后端修改会话 client.get("/cart/remove/2") # 验证购物车状态:重新打开会话事务检查最终状态 with client.session_transaction() as sess: assert [1] == sess.get("cart")
如果你的测试还需要验证首页的显示内容(比如购物车数量),可以把请求放在会话检查之前,但绝对不要放在会话事务里面:
# 设置购物车 with client.session_transaction() as sess: sess["cart"] = [1, 2] # 移除商品 client.get("/cart/remove/2") # 获取首页(验证页面内容用) resp = client.get("/") assert "购物车:1件商品" in resp.data.decode() # 举个页面验证的例子 # 最后检查会话状态 with client.session_transaction() as sess: assert [1] == sess.get("cart")
为什么手动测试正常?
手动操作时,每个请求都是独立完成的:你设置购物车后发起移除请求,服务器会在请求结束后正确保存会话变更,再打开首页时会话已经是更新后的状态。但测试代码里的错误操作导致会话修改被“卡住”,没有同步到后续的请求会话中。
内容的提问来源于stack exchange,提问作者Oisin
相关产品推荐
相关产品推荐

