From 704cf63b6c5b11fd8aa69f04a3ecc6b8b1010473 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Mon, 31 Aug 2026 01:17:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(test):=20test=5Fingest=5Fhevc=5Ftranscode?= =?UTF-8?q?=5Ftask=20=E5=AF=BC=E5=85=A5=E5=90=8E=E7=AB=8B=E5=8D=B3?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=20sys.modules=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=B7=A8=E6=96=87=E4=BB=B6=20mock=20=E6=B1=A1=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 该文件模块级向 sys.modules 注入 worker_app.db/celery_app/core.config、 video_processing.oss_helpers/thumbnail_generator 的 MagicMock(供 ingest 任务模块导入),但导入后从不撤销。pytest-xdist 下同一 worker 进程内 其他测试文件 from video_processing.xxx import 会拿到 MagicMock—— test_thumbnail_generator 的 50 个纯逻辑用例断言到 而失败 (与文件分发/收集顺序相关,非确定性)。 按 test_dedup_pure.py 的既有模式:成功 import ingest_mod 后立即恢复 sys.modules(删除注入的 mock、必要项保留)。patch.object 仍通过本文件 持有的 mock 引用工作,ingest_mod 顶部 from import 已绑定 mock, 本文件测试行为不变。 配套 #1563(test_dedup_engine 父包 mock 污染)。 --- tests/unit/test_ingest_hevc_transcode_task.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/unit/test_ingest_hevc_transcode_task.py b/tests/unit/test_ingest_hevc_transcode_task.py index a02a86bc1..0ccaae476 100644 --- a/tests/unit/test_ingest_hevc_transcode_task.py +++ b/tests/unit/test_ingest_hevc_transcode_task.py @@ -16,6 +16,14 @@ from types import SimpleNamespace from unittest.mock import MagicMock, patch # 在 import worker_app 模块前 mock 掉数据库连接和 celery(同 test_ingest_validation.py) +# 注意:模块级 sys.modules 注入若不撤销,会污染同一 pytest 进程(含 xdist +# worker)后续收集/执行的其他测试文件——它们 from video_processing.xxx +# import 会拿到 MagicMock(表现为 test_thumbnail_generator 纯逻辑用例 +# 断言到 ,50 个用例失败,且与 xdist 分发顺序相关)。 +# 因此在成功 import ingest_mod 之后立即恢复 sys.modules(同 test_dedup_pure.py +# 的做法),mock 对象仍由本文件变量/ingest_mod 引用持有,不影响本文件测试。 +_SAVED_MODULES_KEYS = set(sys.modules.keys()) + _mock_db_module = MagicMock() _mock_db_module.SessionLocal = MagicMock() sys.modules["worker_app.db"] = _mock_db_module @@ -44,6 +52,15 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "apps" / "worker")) import pytest # noqa: E402 from worker_app.tasks import ingest as ingest_mod # noqa: E402 +# ── 立即恢复 sys.modules,避免 mock 泄漏到其他测试文件 ── +for _key in list(sys.modules.keys()): + if _key not in _SAVED_MODULES_KEYS: + # 保留 mock 对象供本文件 patch.object 使用 + if _key in ("video_processing.oss_helpers", "video_processing.thumbnail_generator"): + continue + del sys.modules[_key] +del _SAVED_MODULES_KEYS + class _FakeJobRepo: def __init__(self, db): -- 2.54.0