From 1a6672dc6eae9c136ca0769c24b8db3915ff0ef1 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Mon, 20 Jul 2026 14:12:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(test):=20=E4=BF=AE=E5=A4=8DMagicMock?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E5=AF=BC=E8=87=B4=E7=9A=843=E4=B8=AA?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:测试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 --- tests/unit/test_oneclick_gen_p0_fixes.py | 80 ++++++++++++++++++------ 1 file changed, 60 insertions(+), 20 deletions(-) diff --git a/tests/unit/test_oneclick_gen_p0_fixes.py b/tests/unit/test_oneclick_gen_p0_fixes.py index 6914fd7e6..4bc20f178 100755 --- a/tests/unit/test_oneclick_gen_p0_fixes.py +++ b/tests/unit/test_oneclick_gen_p0_fixes.py @@ -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") -- 2.54.0