From 395475628c8cee6820f08c3e781aee8ec1fd6682 Mon Sep 17 00:00:00 2001 From: Kris <2893855659@qq.com> Date: Sat, 30 May 2026 21:55:54 +0800 Subject: [PATCH] =?UTF-8?q?test(agent=20adapter):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E7=9A=84?= =?UTF-8?q?mock=E5=88=9B=E5=BB=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 抽取出公共的_make_chat_service_mock工具函数简化测试代码 2. 使用sys.modules patch替代直接patch目标函数,更贴合真实依赖注入场景 3. 删除冗余的async_iter辅助函数 --- .../agent/test_agent_adapter.py | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/backend/test/unit/channel/infrastructure/agent/test_agent_adapter.py b/backend/test/unit/channel/infrastructure/agent/test_agent_adapter.py index c9b1c6e7..2369724a 100644 --- a/backend/test/unit/channel/infrastructure/agent/test_agent_adapter.py +++ b/backend/test/unit/channel/infrastructure/agent/test_agent_adapter.py @@ -1,10 +1,10 @@ from __future__ import annotations +import sys from unittest.mock import AsyncMock, MagicMock, patch import pytest -import yuxi.services.chat_service # noqa: F401 from yuxi.channel.domain.model.message.stream_chat_request import StreamChatRequest from yuxi.channel.domain.model.shared.channel_type import ChannelType from yuxi.channel.infrastructure.agent.agent_adapter import AgentAdapter @@ -36,6 +36,17 @@ def stream_request() -> StreamChatRequest: ) +def _make_chat_service_mock(chunks: list[str]): + mock_svc = MagicMock() + + async def _stream_gen(*args, **kwargs): + for chunk in chunks: + yield chunk + + mock_svc.stream_agent_chat = _stream_gen + return mock_svc + + class TestAgentAdapter: @pytest.mark.asyncio async def test_get_service_user_found(self, adapter: AgentAdapter, fake_session_factory) -> None: @@ -89,11 +100,11 @@ class TestAgentAdapter: result_mock.scalar_one_or_none.return_value = fake_user db.execute.return_value = result_mock - with patch("yuxi.services.chat_service.stream_agent_chat") as mock_stream: - mock_stream.return_value = async_iter([ - '{"response": "hello", "status": "success"}', - '{"response": " world", "status": "success"}', - ]) + mock_svc = _make_chat_service_mock([ + '{"response": "hello", "status": "success"}', + '{"response": " world", "status": "success"}', + ]) + with patch.dict(sys.modules, {"yuxi.services.chat_service": mock_svc}): result = await adapter.stream_chat(stream_request) assert result == "hello world" @@ -104,8 +115,10 @@ class TestAgentAdapter: result_mock.scalar_one_or_none.return_value = None db.execute.return_value = result_mock - result = await adapter.stream_chat(stream_request) - assert "Error: no service user found" in result + mock_svc = _make_chat_service_mock([]) + with patch.dict(sys.modules, {"yuxi.services.chat_service": mock_svc}): + result = await adapter.stream_chat(stream_request) + assert "Error: no service user found" in result @pytest.mark.asyncio async def test_stream_chat_error_status(self, adapter: AgentAdapter, stream_request: StreamChatRequest, fake_session_factory) -> None: @@ -117,11 +130,11 @@ class TestAgentAdapter: result_mock.scalar_one_or_none.return_value = fake_user db.execute.return_value = result_mock - with patch("yuxi.services.chat_service.stream_agent_chat") as mock_stream: - mock_stream.return_value = async_iter([ - '{"response": "hello", "status": "success"}', - '{"status": "error", "error_message": "something wrong"}', - ]) + mock_svc = _make_chat_service_mock([ + '{"response": "hello", "status": "success"}', + '{"status": "error", "error_message": "something wrong"}', + ]) + with patch.dict(sys.modules, {"yuxi.services.chat_service": mock_svc}): result = await adapter.stream_chat(stream_request) assert "hello" in result @@ -135,14 +148,9 @@ class TestAgentAdapter: result_mock.scalar_one_or_none.return_value = fake_user db.execute.return_value = result_mock - with patch("yuxi.services.chat_service.stream_agent_chat") as mock_stream: - mock_stream.return_value = async_iter([ - '{"status": "error", "error_message": "something wrong"}', - ]) + mock_svc = _make_chat_service_mock([ + '{"status": "error", "error_message": "something wrong"}', + ]) + with patch.dict(sys.modules, {"yuxi.services.chat_service": mock_svc}): result = await adapter.stream_chat(stream_request) assert "Error: something wrong" in result - - -async def async_iter(items: list[str]): - for item in items: - yield item