From 8d280e3df9a1da78be0977b0a6ddaa8638d194a3 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Sat, 25 Jul 2026 20:53:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(test):=20=E4=BF=AE=E5=A4=8Dtest=5Fdedup=5Fp?= =?UTF-8?q?ure=E6=94=B6=E9=9B=86=E9=98=B6=E6=AE=B5db=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E5=89=AF=E4=BD=9C=E7=94=A8=20+=20=E5=AE=8C=E6=95=B4mock=20(#89?= =?UTF-8?q?4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/unit/test_dedup_pure.py | 58 ++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_dedup_pure.py b/tests/unit/test_dedup_pure.py index cc58e6d9a..b5ec6c965 100755 --- a/tests/unit/test_dedup_pure.py +++ b/tests/unit/test_dedup_pure.py @@ -8,12 +8,68 @@ from unittest.mock import MagicMock import numpy as np import pytest -# 模块级mock cv2(dedup模块import时需要) +# 模块级mock有副作用的依赖(纯算法测试不需要db/celery/cv2) +# 注意:必须在 import dedup 前全部 mock 完,避免链式导入触发db连接 + +# cv2(视频处理依赖,纯算法测试不需要) sys.modules["cv2"] = MagicMock() # 模块级mock worker_app.db(dedup模块import时会触发数据库初始化,纯算法测试不需要) sys.modules["worker_app.db"] = MagicMock() sys.modules["worker_app.db"].SessionLocal = MagicMock() +# celery 及其子模块 +_mock_celery = MagicMock() +_mock_celery.Task = MagicMock +_mock_celery.Celery = MagicMock +sys.modules["celery"] = _mock_celery + +# sqlalchemy 作为包结构 mock +_mock_sqla = MagicMock() +_mock_sqla.__path__ = [] +_mock_sqla.__package__ = "sqlalchemy" +_mock_sqla_orm = MagicMock() +_mock_sqla_orm.__path__ = [] +_mock_sqla_orm.Session = MagicMock +_mock_sqla_engine = MagicMock() +sys.modules["sqlalchemy"] = _mock_sqla +sys.modules["sqlalchemy.orm"] = _mock_sqla_orm +sys.modules["sqlalchemy.engine"] = _mock_sqla_engine +sys.modules["sqlalchemy.ext"] = MagicMock() +sys.modules["sqlalchemy.ext.declarative"] = MagicMock() + +# worker_app 及其子模块(避免导入时触发数据库连接) +_mock_worker_app = MagicMock() +_mock_worker_app.__path__ = [] +_mock_worker_db = MagicMock() +_mock_worker_db.SessionLocal = MagicMock() +_mock_worker_celery = MagicMock() +_mock_worker_celery.celery_app = MagicMock() +_mock_worker_core = MagicMock() +_mock_worker_core.__path__ = [] +_mock_worker_config = MagicMock() +_mock_worker_config.get_settings = MagicMock(return_value=MagicMock()) +sys.modules["worker_app"] = _mock_worker_app +sys.modules["worker_app.db"] = _mock_worker_db +sys.modules["worker_app.celery_app"] = _mock_worker_celery +sys.modules["worker_app.core"] = _mock_worker_core +sys.modules["worker_app.core.config"] = _mock_worker_config + +# packages.adapters.sqlalchemy_impl(整个包mock掉) +_mock_sqla_impl = MagicMock() +_mock_sqla_impl.__path__ = [] +sys.modules["packages.adapters.sqlalchemy_impl"] = _mock_sqla_impl +sys.modules["packages.adapters.sqlalchemy_impl.generated_video_repository"] = MagicMock() +sys.modules["packages.adapters.sqlalchemy_impl.schema_guard"] = MagicMock() + +# packages.shared +_mock_packages_shared = MagicMock() +_mock_packages_shared.__path__ = [] +_mock_shared_config = MagicMock() +_mock_shared_config.get_shared_settings = MagicMock(return_value=MagicMock()) +sys.modules["packages.shared"] = _mock_packages_shared +sys.modules["packages.shared.config"] = _mock_shared_config +sys.modules["packages.shared.storage"] = MagicMock() + from video_processing.dedup import ( # noqa: E402 VideoDeduplicator, VideoFingerprint,