From 44efd776e94ebc5589b7b4e882378206504bf2d0 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Mon, 17 Aug 2026 23:38:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(test):=20=E4=BF=AE=E5=A4=8D=20MagicMock=20?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E8=87=AA=E5=8A=A8=E5=88=9B=E5=BB=BA=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=9A=84=E6=96=AD=E8=A8=80=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用 FakeGenTask 替代 MagicMock,通过追踪 _assigned 字典 准确判断 cover_url 是否被显式设置。 --- tests/unit/test_cover_url_finalize.py | 42 ++++++++++++++++++--------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/tests/unit/test_cover_url_finalize.py b/tests/unit/test_cover_url_finalize.py index 5bc28d13b..079554e36 100644 --- a/tests/unit/test_cover_url_finalize.py +++ b/tests/unit/test_cover_url_finalize.py @@ -6,9 +6,32 @@ from cover_candidates to gen_task.cover_url. from __future__ import annotations +import sys from pathlib import Path from unittest.mock import MagicMock, patch +import pytest + +# Add worker app to sys.path +_WORKER_ROOT = Path(__file__).resolve().parents[2] / "apps" / "worker" +if str(_WORKER_ROOT) not in sys.path: + sys.path.insert(0, str(_WORKER_ROOT)) + + +class FakeGenTask: + """Simple stand-in for GenerationTask that tracks attribute assignment.""" + + def __init__(self): + self.id = "task-1" + self.status = MagicMock() + self.status.value = "running" + self._assigned = {} + + def __setattr__(self, name, value): + if not name.startswith("_"): + self._assigned[name] = value + super().__setattr__(name, value) + def _make_plan(): plan = MagicMock() @@ -19,19 +42,11 @@ def _make_plan(): return plan -def _make_gen_task(): - gen_task = MagicMock() - gen_task.id = "task-1" - gen_task.status = MagicMock() - gen_task.status.value = "running" - return gen_task - - def _call_finalize(cover_candidates=None, gen_task=None, plan=None): from worker_app.tasks.edit_plan_generation import _finalize_render_success plan = plan or _make_plan() - gen_task = gen_task or _make_gen_task() + gen_task = gen_task or FakeGenTask() plan_repo = MagicMock() clip_repo = MagicMock() @@ -86,25 +101,26 @@ class TestFinalizeCoverUrl: def test_cover_url_not_set_when_empty_list(self): """Empty cover_candidates should not set cover_url""" _, gen_task, _ = _call_finalize(cover_candidates=[]) - assert not getattr(gen_task, "cover_url", None) + assert "cover_url" not in gen_task._assigned def test_cover_url_not_set_when_none(self): """None cover_candidates should not set cover_url""" _, gen_task, _ = _call_finalize(cover_candidates=None) - assert not getattr(gen_task, "cover_url", None) + assert "cover_url" not in gen_task._assigned def test_cover_url_not_set_when_url_empty(self): """Empty URL strings in candidates should not set cover_url""" candidates = [{"image_url": "", "url": ""}] _, gen_task, _ = _call_finalize(cover_candidates=candidates) - assert not getattr(gen_task, "cover_url", None) + assert "cover_url" not in gen_task._assigned def test_no_generation_task_no_crash(self): """Should not crash when gen_task is None""" candidates = [{"image_url": "https://oss.example.com/cover.jpg"}] gen_task_repo = MagicMock() gen_task_repo.get.return_value = None - _, _, _ = _call_finalize(cover_candidates=candidates) + result, _, _ = _call_finalize(cover_candidates=candidates) + assert result["status"] == "completed" def test_image_url_priority_over_url(self): """image_url should take priority over url key"""