test: 修复取消链路测试在全量跑时受 sys.modules 污染失败
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 2s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 53s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m0s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m7s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m5s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m10s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 4m31s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 4m39s
AI Code Review / AI Code Review (pull_request) Successful in 6m43s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 9m28s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 11m2s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 2s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 8m43s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 32s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 43s

全量跑时其他测试可能把 app.services.gpu_lipsync_service 换成 MagicMock,
导致任务函数内 from...import 拿到污染对象。改用 monkeypatch.setitem
直接替换 sys.modules 模块项,并 patch _get_db_session 绕开双 import 分支,
确保测试在任何污染场景下都稳定。
This commit is contained in:
saas-backend
2026-09-22 01:10:22 +08:00
parent 3a0f1eba03
commit 87dfed2f8a
+12 -11
View File
@@ -263,21 +263,21 @@ def test_cancelled_gpu_task_does_not_fallback_mediakit(monkeypatch):
fake_gpu_svc = MagicMock()
fake_gpu_svc.wait_for_result.return_value = gpu_task
gpu_service_cls = MagicMock(return_value=fake_gpu_svc)
fake_db = MagicMock()
fake_db.query.return_value.filter_by.return_value.first.return_value = job
# wait_for_result 直接被 mock 到 gpu_svc,这里仅备查
monkeypatch.setattr(
"app.services.gpu_lipsync_service.GpuLipsyncService",
MagicMock(return_value=fake_gpu_svc),
)
session_factory = MagicMock()
session_factory.return_value = fake_db
# _get_db_session 优先用 worker_app.db(pytest 环境可导入),两个都 patch
monkeypatch.setattr("worker_app.db.SessionLocal", session_factory)
monkeypatch.setattr("app.db.SessionLocal", session_factory)
monkeypatch.setattr("app.tasks.lipsync_gpu.logger", MagicMock())
# 直接替换 sys.modules 里的 gpu_lipsync_service 模块(全量跑时它可能已被
# 其他测试换成 MagicMock),保证任务函数内 from...import 一定拿到我们的类;
# 并替换 _get_db_session 绕开 worker_app / app.db 两条 import 分支。
import sys
from types import SimpleNamespace
fake_mod = SimpleNamespace(GpuLipsyncService=gpu_service_cls)
monkeypatch.setitem(sys.modules, "app.services.gpu_lipsync_service", fake_mod)
monkeypatch.setattr(task_mod, "_get_db_session", lambda: fake_db)
monkeypatch.setattr(task_mod, "logger", MagicMock())
task_mod.lipsync_gpu_process_async.run("job-1", "u1", "gpu-task-1")
@@ -285,3 +285,4 @@ def test_cancelled_gpu_task_does_not_fallback_mediakit(monkeypatch):
assert not str(job.mediakit_task_id).startswith("mk-")
fake_db.commit.assert_called()
fake_gpu_svc.wait_for_result.assert_called_once()
gpu_service_cls.assert_called_once_with(fake_db)