From a8122dd63432664bdd9709598eeb5b717fb64021 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Mon, 31 Aug 2026 02:16:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(test):=20hevc=20=E8=BD=AC=E7=A0=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=81=A2=E5=A4=8D=20sys.modules=20=E6=97=B6=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=85=A8=E9=83=A8=20mock=20=E6=9D=A1=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #1566 v1 的恢复块保留了 video_processing.oss_helpers / thumbnail_generator 两个 mock 条目(误以为 patch.object 需要),导致同 xdist worker 后续测试 文件 import video_processing.* 仍拿到 MagicMock——test_thumbnail_generator 50 个用例继续失败(#1561/#1562 CI 实证)。 修复: 1. 恢复时删除全部注入的 mock 条目,杜绝跨文件 mock 污染; 2. restore 后显式 import 真实 oss_helpers 模块,upload patcher 直接打在 真实模块上(patch stop 自动还原,无污染);thumb patcher 为字符串目标, start 时自动导入真实模块打补丁。 --- tests/unit/test_ingest_hevc_transcode_task.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/unit/test_ingest_hevc_transcode_task.py b/tests/unit/test_ingest_hevc_transcode_task.py index 0ccaae476..db1159220 100644 --- a/tests/unit/test_ingest_hevc_transcode_task.py +++ b/tests/unit/test_ingest_hevc_transcode_task.py @@ -53,14 +53,20 @@ import pytest # noqa: E402 from worker_app.tasks import ingest as ingest_mod # noqa: E402 # ── 立即恢复 sys.modules,避免 mock 泄漏到其他测试文件 ── +# 本文件 patch.object 不依赖 mock 条目保留在 sys.modules:download_asset +# 已被 ingest_mod 顶部 from import 绑定;thumb patcher 是字符串目标,start +# 时会触发真实模块重新导入后再打补丁(真实模块 CI 可导入)。因此注入的 +# mock 条目必须全部删除——若保留 video_processing.* mock,同 xdist worker +# 后续测试文件 import 仍会拿到 MagicMock(#1566 v1 曾因此漏修)。 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 +# 导入真实模块供本文件 patch.object 打补丁(restore 后 sys.modules 中已无 +# mock)。patch 在 stop 时会自动还原模块属性,不影响其他测试文件。 +from video_processing import oss_helpers as _oss_helpers_real # noqa: E402 + class _FakeJobRepo: def __init__(self, db): @@ -172,7 +178,7 @@ def task_env(tmp_path): "asset_repo": patch.object(ingest_mod, "SQLAlchemyAssetRepository", return_value=asset_repo), "download": patch.object(ingest_mod, "download_asset", return_value=True), "upload": patch.object( - sys.modules["video_processing.oss_helpers"], + _oss_helpers_real, "upload_to_oss", return_value=control["upload_url"], ), -- 2.54.0