fix(tests): resolve flaky test_batch_download_session_closed #1406
Reference in New Issue
Block a user
Delete Branch "fix/flaky-batch-download-session-test"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
test_batch_download_session_closed在全量测试运行时偶发失败(session.close.assert_called_once()报 Called 0 times),单独跑 16/16 通过。根因
_run_with_fakes在 patch 上下文之前调用session_maker()创建 session_get_current_object()缓存patch("worker_app.db.SessionLocal", ...)在模块缓存状态下不够可靠修复方案
patch.object替代字符串路径 patch:直接在实际的worker_app.db模块对象上打 patch,避免模块解析时序问题test_batch_download_session_closed改为自包含:不再依赖_run_with_fakes,直接使用patch.object确保完全隔离test_batch_download_closes_session_on_error同步修复:使用相同的patch.object模式改动文件
tests/unit/test_batch_download.py_run_with_fakes: 改用patch.object(_db_mod, "SessionLocal", ...)+ session 追踪 wrappertest_batch_download_session_closed: 自包含实现,不依赖_run_with_fakestest_batch_download_closes_session_on_error: 改用patch.object测试
pytest tests/unit/test_batch_download.py -v→ 16/16 通过影响
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
无
💡 改进建议(不阻塞合并)
test_batch_download_session_closed函数将原本通过_run_with_fakes封装的逻辑内联到了测试函数中(包括 patch 设置和调用逻辑)。虽然这解决了特定的PromiseProxy缓存问题,但导致了代码重复。如果_run_with_fakes已经更新为使用patch.object,建议评估是否可以复用该辅助函数,或者将通用的 patch 上下文管理器提取为 fixture,以保持测试代码的简洁。✅ 良好实践
patch.object替代字符串路径:在_run_with_fakes和测试用例中,将patch("worker_app.db.SessionLocal", ...)修改为import worker_app.db; patch.object(worker_app.db, "SessionLocal", ...)。这是一种更稳健的做法,能有效解决因模块导入顺序或代理对象(如 PromiseProxy)导致的 mock 失效或缓存问题。_run_with_fakes中引入_tracking_sm来捕获实际创建的 session 实例,这比直接使用 mock 对象更能反映真实代码的执行路径,便于测试 session 的生命周期管理。captured和_created_sessions添加了类型提示,提高了代码的可读性和静态分析能力。🤖 由 AI 代码审查机器人自动生成 | 2026-08-17 11:50:50 | 模型:
🗑️ 预览环境已清理
PR #1406 已关闭或合并,对应的预览环境已被清理。