diff --git a/tests/unit/test_ingest_hevc_transcode_task.py b/tests/unit/test_ingest_hevc_transcode_task.py index a02a86bc1..41a795680 100644 --- a/tests/unit/test_ingest_hevc_transcode_task.py +++ b/tests/unit/test_ingest_hevc_transcode_task.py @@ -45,6 +45,38 @@ import pytest # noqa: E402 from worker_app.tasks import ingest as ingest_mod # noqa: E402 +# ── 模块级 mock 的清理 ───────────────────────────────────────────────────── +# 上方在模块导入时往 sys.modules 注入了 worker_app.* / video_processing.* +# 的 MagicMock(为了让 ingest_mod 可导入)。模块级注入不会随测试结束自动 +# 撤销,会污染同一 pytest 进程(含 xdist worker)后续执行的其他测试文件: +# 例如 test_thumbnail_generator.py 的纯逻辑用例会从 sys.modules 拿到 +# MagicMock 版本的 video_processing.thumbnail_generator,全部断言失败。 +# 用 module 作用域 autouse fixture 在本文件测试跑完后恢复真实模块。 +_MOCKED_MODULE_NAMES = ( + "worker_app.db", + "worker_app.core.config", + "worker_app.celery_app", + "video_processing.oss_helpers", + "video_processing.thumbnail_generator", +) + + +@pytest.fixture(scope="module", autouse=True) +def _restore_sys_modules_after_module_tests(): + yield + for _name in _MOCKED_MODULE_NAMES: + sys.modules.pop(_name, None) + # 重新导入真实模块,让后续测试文件拿到真实实现 + import importlib + + importlib.invalidate_caches() + for _name in ("video_processing.oss_helpers", "video_processing.thumbnail_generator"): + try: + importlib.import_module(_name) + except Exception: + pass + + class _FakeJobRepo: def __init__(self, db): self.initial_job = SimpleNamespace(