fix(test): 修复MagicMock枚举导致的3个单元测试失败
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 18s
AI Code Review / AI Code Review (pull_request) Failing after 32s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m18s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 7m30s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 57s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 23s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 1392h5m41s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 1392h5m48s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 1392h5m48s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 1392h5m49s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 1392h5m49s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 1392h5m50s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 1392h5m50s
CI/CD Pipeline / Check if frontend-only change (pull_request) Has been skipped
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 1392h37m58s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 1392h37m57s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 1392h37m58s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 1392h37m57s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 1392h37m57s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 1392h37m58s

根因:测试mock SessionLocal时未区分新/旧模板系统的model查询,
SQLAlchemyEditTemplateRepository.get()也会走到mock session并返回MagicMock,
导致_model_to_entity中EditTemplateStatus(model.status)枚举转换失败。

修复:mock session.query()增加side_effect,根据model类型返回不同结果:
- EditTemplateModel查询返回None(强制走旧模板系统fallback)
- TemplateModel查询返回mock template(测试目标路径)

影响测试:
- TestP1Validations.test_validate_template_exists_success
- TestTemplatePlanConfigLoading.test_load_template_config_assembles_three_fields
- TestTemplatePlanConfigLoading.test_load_template_config_only_bgm
This commit is contained in:
CI Bot
2026-07-20 14:12:12 +08:00
parent f06a00bc7b
commit 1a6672dc6e
+60 -20
View File
@@ -241,11 +241,27 @@ class TestP1Validations:
mock_template.is_active = True
session = MagicMock()
mock_session = MagicMock()
session.query.return_value = mock_session
filter_result = MagicMock()
mock_session.filter.return_value = filter_result
filter_result.first.return_value = mock_template
# EditTemplateModel 查询返回 None(走旧模板系统 fallback)
edit_query = MagicMock()
edit_filter = MagicMock()
edit_query.filter.return_value = edit_filter
edit_filter.first.return_value = None
# TemplateModel 查询返回 mock_template
old_query = MagicMock()
old_filter = MagicMock()
old_query.filter.return_value = old_filter
old_filter.first.return_value = mock_template
def _query_side_effect(model):
# 根据 model 类型返回不同的 query mock
name = getattr(model, "__name__", "")
if "EditTemplate" in name:
return edit_query
return old_query
session.query.side_effect = _query_side_effect
with patch("worker_app.tasks.generation.SessionLocal", return_value=session):
_validate_template_exists("tmpl_001") # 不抛异常
@@ -255,11 +271,16 @@ class TestP1Validations:
from worker_app.tasks.generation import _validate_template_exists
session = MagicMock()
mock_session = MagicMock()
session.query.return_value = mock_session
filter_result = MagicMock()
mock_session.filter.return_value = filter_result
filter_result.first.return_value = None
# 两个系统查询都返回 None
def _query_side_effect(model):
q = MagicMock()
f = MagicMock()
q.filter.return_value = f
f.first.return_value = None
return q
session.query.side_effect = _query_side_effect
with patch("worker_app.tasks.generation.SessionLocal", return_value=session):
with pytest.raises(ValueError, match="模板不存在"):
@@ -431,11 +452,26 @@ class TestTemplatePlanConfigLoading:
def _mock_session(self, template):
session = MagicMock()
mock_query = MagicMock()
session.query.return_value = mock_query
filter_result = MagicMock()
mock_query.filter.return_value = filter_result
filter_result.first.return_value = template
# EditTemplateModel 查询返回 None(走旧模板系统 fallback)
edit_query = MagicMock()
edit_filter = MagicMock()
edit_query.filter.return_value = edit_filter
edit_filter.first.return_value = None
# TemplateModel 查询返回 template(旧模板系统)
old_query = MagicMock()
old_filter = MagicMock()
old_query.filter.return_value = old_filter
old_filter.first.return_value = template
def _query_side_effect(model):
name = getattr(model, "__name__", "")
if "EditTemplate" in name:
return edit_query
return old_query
session.query.side_effect = _query_side_effect
return session
def test_load_template_config_assembles_three_fields(self):
@@ -503,11 +539,15 @@ class TestTemplatePlanConfigLoading:
from worker_app.tasks.generation import _load_template_plan_config
session = MagicMock()
mock_query = MagicMock()
session.query.return_value = mock_query
filter_result = MagicMock()
mock_query.filter.return_value = filter_result
filter_result.first.return_value = None
def _query_side_effect(model):
q = MagicMock()
f = MagicMock()
q.filter.return_value = f
f.first.return_value = None
return q
session.query.side_effect = _query_side_effect
with patch("worker_app.tasks.generation.SessionLocal", return_value=session):
result = _load_template_plan_config("tmpl_nonexist")