快速结论:这个报错通常出现在 Dify 仓库中清理 `api/tests/unit_tests/` 下遗留的 SQLAlchemy mock session(mock 会话)时,优先排查目标测试文件中是否还残留伪造的 session、engine、query 或 result 双件(test double),而不是生产代码本身。
适用环境:Dify 仓库的 Python API 单元测试;Issue 基于 checkout `1f500e52cc`,测试目录为 `api/tests/unit_tests/`。Issue 中未明确给出操作系统、Python、CUDA、显卡或具体依赖版本。
最快修复方案:暂无确认的一步修复方案。Issue 中的做法是分文件推进:把与持久化场景相关的 mocked session 替换为共享的 `sqlite_session` 或 `unbound_session` fixture,并为每处改动单独提交 PR,运行对应文件的 pytest 以及 Ruff/type 检查。
注意事项:“clean remaining mock session”是 Issue 标题中的任务表述,Issue 里没有贴出可直接复现的运行时异常堆栈,所以本文按代码清理任务排错,不当作运行时报错处理。不要把刻意构造的失败测试或 no-DB 测试中的 mock 一并删掉,否则会丢失有效覆盖。PR 是否合并、各切片的本地测试结果需以对应 PR 为准。
问题场景
在 Dify 仓库中清理测试代码时,维护者发现 `api/tests/unit_tests/` 下仍有测试用 mock 伪造 SQLAlchemy session、engine、query 和 result,而不是用真实 SQLite 或共享 fixture 验证持久化行为。Issue #44973 给出了按文件划分的清单,例如 tasks/test_remove_app_and_related_data_task.py、services/agent/test_home_snapshot_service.py、services/agent/test_workflow_publish_service.py、services/knowledge_fs/test_query_images.py 等。贡献者按文件认领切片,各自提交 PR。
报错原文
clean remaining mock session
原因分析
可能原因:这些测试仍用 _FakeSessionFactory、_ScriptedSession、_ScalarsSession、autospec 的 Session 或手工返回预置结果的 mock session,绕过真实 SQL 执行、查询参数解释和 commit 行为。这类 mock 会让测试与 ORM 实际行为脱节,因此需要改为写入真实记录后用 SQLite 查询断言。Issue 本身描述的是测试遗留 mock 的清理清单,不是某个函数抛出异常;若你在本地遇到类似提示,应优先定位被点名文件中的 mock 类或 fixture。
环境排查
- 确认仓库 checkout 是否为 Issue 提及的
1f500e52cc或包含相应文件的最新分支,路径以api/tests/unit_tests/为基准。 - 确认目标测试文件是否仍在用 mocked
Session、伪造的scalar/scalars返回值或脚本化 session。 - 确认测试是否已有共享 fixture(如
sqlite_session、unbound_session)可用,避免重复造轮子。 - 确认改动范围只限测试文件,不修改生产代码。
- Issue 未提供 Python、CUDA、PyTorch、显卡或依赖版本信息,不要据此推断环境要求。
解决步骤
- 从 Issue 清单中挑一个独立文件切片,例如
services/agent/test_workflow_publish_service.py中的test_publish_copy_uses_current_roster_snapshot,或services/test_app_generate_service.py中把占位 session/factory 换成unbound_session的路径。 - 判断该测试属于持久化场景还是刻意失败/no-DB 场景:持久化场景应写入真实 Agent、Workspace、Binding、上传记录等数据,再用 SQLite session 查询并断言;no-DB 场景则保留
unbound_session,不要强行改成持久化。 - 替换 mock session 时保留原有断言价值,例如“不应发起查询”“不应调用
mutations.update_segment”、事务状态检查,或对 502/413 错误的映射断言。 - 先运行该文件对应的 pytest,再运行 Ruff 检查和格式检查;Issue 评论中提到
ruff check和ruff format --check,但不要自行臆造额外命令。 - 每个文件单独开 PR 并回链 #44973;若认领的切片已被其他合并 PR 覆盖,就撤回认领,避免重复工作。
验证方法
确认目标文件不再依赖伪造的 SQLAlchemy session/query/result,测试通过真实 fixture 或 SQLite 完成查询与断言;对应文件的 pytest 通过,Ruff 检查与格式检查通过;PR 中记录了实际测试结果。Issue 里出现过分文件 PR 示例,但具体通过数量以各 PR 报告为准。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![[Bug]: Security concern: `/invocations` endpoint is enabled by default and bypasses API key authentication](https://www.chat-gpts.plus/wp-content/uploads/2026/10/64391-4ea45fd5-768x403.jpg)