diff --git a/apps/web/package.json b/apps/web/package.json index 8fe1514e2..55c181ab9 100755 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -44,6 +44,7 @@ "jsdom": "^24.1.0", "typescript": "^5.5.3", "vite": "^5.3.1", - "vitest": "^1.6.0" + "vitest": "^1.6.0", + "prettier": "^3.9.5" } } diff --git a/tests/conftest.py b/tests/conftest.py index 1e9afca79..e2155d134 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -11,3 +11,42 @@ if str(ROOT) not in sys.path: # 必须在任何 app 模块导入之前设置,否则 pydantic Settings 验证失败 os.environ.setdefault("JWT_SECRET_KEY", "test-secret-key-for-all-tests") os.environ.setdefault("USE_IN_MEMORY_DB", "True") + + +# ── Celery 全局 mock ────────────────────────────────────────────────────── +# CI 环境没有 Redis,所有 Celery 异步任务都 mock 掉,避免连接超时报错 +# 集成测试只测 API 层逻辑(参数校验、权限、DB 操作),异步任务由 worker 单测覆盖 + +from unittest.mock import MagicMock + + +def _mock_celery_task(): + """全局 mock Celery 任务的 delay/apply_async/send_task 方法。""" + from celery import Celery, Task + + def _mock_delay(self, *args, **kwargs): + mock_result = MagicMock() + mock_result.id = "mock-task-id" + mock_result.state = "PENDING" + mock_result.ready.return_value = False + mock_result.get.return_value = None + return mock_result + + def _mock_apply_async(self, *args, **kwargs): + return _mock_delay(self, *args, **kwargs) + + def _mock_send_task(self, name, *args, **kwargs): + mock_result = MagicMock() + mock_result.id = f"mock-{name}" + mock_result.state = "PENDING" + mock_result.ready.return_value = False + mock_result.get.return_value = None + return mock_result + + Task.delay = _mock_delay + Task.apply_async = _mock_apply_async + Celery.send_task = _mock_send_task + + +# 在任何 app 模块导入之前就 patch 掉 +_mock_celery_task()