From c10552dae190f3eb42c47be4a021b98565c73f15 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Sat, 25 Jul 2026 16:49:47 +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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:video_processing/dedup.py 顶层import worker_app.db, 而 db.py 模块加载时就执行 ensure_database_exists() 触发数据库连接。 纯函数测试不需要任何db/celery/cv2依赖。 修复:在测试模块顶部预先mock掉所有有副作用的模块 (cv2/celery/sqlalchemy/worker_app/packages.adapters/packages.shared), 确保 import dedup 时不会触发真实的数据库连接。 20 passed ✅ --- 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 9c82021b8..0abfb8a80 100755 --- a/tests/unit/test_dedup_pure.py +++ b/tests/unit/test_dedup_pure.py @@ -8,9 +8,65 @@ 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() +# 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, -- 2.54.0