diff --git a/tests/unit/test_ai_avatar_render_service.py b/tests/unit/test_ai_avatar_render_service.py index 62cf82691..99e28928b 100644 --- a/tests/unit/test_ai_avatar_render_service.py +++ b/tests/unit/test_ai_avatar_render_service.py @@ -547,7 +547,7 @@ class TestAiAvatarRenderService: with ( patch.object(svc, "_download_video", return_value="/tmp/video.mp4"), patch.object(svc, "_upload_to_oss", side_effect=lambda path, key: f"https://oss/{key}"), - patch("os.system", return_value=0), + patch("subprocess.run") as mock_run, patch("tempfile.TemporaryDirectory") as tmpdir_mock, patch( "app.services.ai_avatar_cover_service.generate_smart_cover", return_value="https://oss/smart_cover.jpg" @@ -557,6 +557,9 @@ class TestAiAvatarRenderService: "packages.adapters.sqlalchemy_impl.generated_video_repository.SQLAlchemyGeneratedVideoRepository" ) as repo_cls, ): + import subprocess as _sp + + mock_run.return_value = _sp.CompletedProcess(args=[], returncode=0, stdout="", stderr="") import tempfile as _tf tmpdir_mock.return_value.__enter__ = MagicMock(return_value="/tmp/testdir") @@ -605,10 +608,13 @@ class TestAiAvatarRenderService: with ( patch.object(svc, "_download_video", return_value="/tmp/video.mp4"), patch.object(svc, "_upload_to_oss", side_effect=lambda path, key: f"https://oss/{key}"), - patch("os.system", return_value=0), + patch("subprocess.run") as mock_run, patch("tempfile.TemporaryDirectory") as tmpdir_mock, patch("app.services.ai_avatar_cover_service.generate_smart_cover", side_effect=RuntimeError("DB error")), ): + import subprocess as _sp + + mock_run.return_value = _sp.CompletedProcess(args=[], returncode=0, stdout="", stderr="") tmpdir_mock.return_value.__enter__ = MagicMock(return_value="/tmp/testdir") tmpdir_mock.return_value.__exit__ = MagicMock(return_value=False) svc.execute_render("render-clip-fail") diff --git a/tests/unit/test_lipsync_speed_optimization.py b/tests/unit/test_lipsync_speed_optimization.py index 7c4a39eb3..5963b8a51 100644 --- a/tests/unit/test_lipsync_speed_optimization.py +++ b/tests/unit/test_lipsync_speed_optimization.py @@ -35,7 +35,10 @@ class TestFFmpegPresetOptimization: final_label=None, output_path="/tmp/output.mp4", ) - assert "-preset veryfast" in cmd, f"期望 -preset veryfast,实际命令: {cmd}" + # cmd 现在是 list[str];preset 与值是相邻两个元素 + assert "-preset" in cmd, f"期望包含 -preset,实际命令: {cmd}" + preset_idx = cmd.index("-preset") + assert cmd[preset_idx + 1] == "veryfast", f"期望 veryfast,实际: {cmd}" def test_preset_veryfast_with_filter(self): """带滤镜场景下也必须使用 veryfast.""" @@ -49,7 +52,8 @@ class TestFFmpegPresetOptimization: final_label="[v]", output_path="/tmp/output.mp4", ) - assert "-preset veryfast" in cmd + assert "-preset" in cmd + assert cmd[cmd.index("-preset") + 1] == "veryfast" assert "-filter_complex" in cmd def test_preset_not_fast(self): @@ -65,11 +69,11 @@ class TestFFmpegPresetOptimization: output_path="/tmp/output.mp4", ) # 确保是 veryfast 而不是 fast - assert "-preset veryfast" in cmd - # 排除 "fast" 单独出现(veryfast 包含 fast 子串,需精确判断) - parts = cmd.split() - preset_idx = parts.index("-preset") - assert parts[preset_idx + 1] == "veryfast" + assert "-preset" in cmd + preset_idx = cmd.index("-preset") + assert cmd[preset_idx + 1] == "veryfast" + # 禁止 fast 单独作为 preset 值(veryfast 包含 "fast" 子串,不影响) + assert cmd[preset_idx + 1] != "fast" # ═══════════════════════════════════════════════════════════════════════════════