使用python-telegram-bot如何构造假用户测试群聊内机器人命令响应
python-telegram-bot 命令测试实现方案
User和Chat实例不需要调用额外方法关联,你只需要按照Telegram API的结构手动构造Update对象,将这两个实例填充到对应字段后喂给机器人的处理流程即可,这也是官方推荐的单元测试方案,无需发起真实网络请求。
具体实现步骤如下:
- 导入依赖类,构造基础的Chat、User模拟对象
from datetime import datetime from telegram import Chat, User, Message, Update chat = Chat(id=0, type="group") user = User(id=123, first_name="Sam", is_bot=False)
- 构造模拟消息对象,关联用户、聊天和命令内容
mock_message = Message( message_id=1, from_user=user, chat=chat, text="/start", # 替换为你要测试的命令内容 date=datetime.now() )
- 构造Update对象,这是机器人处理流程的标准输入单位
mock_update = Update( update_id=1000, message=mock_message )
- 将模拟Update喂给你的机器人实例触发处理逻辑
# 假设你已经初始化了Application实例:application = Application.builder().token("你的token").build() await application.process_update(mock_update)
如果需要校验机器人的返回内容,可以通过替换bot.send_message方法捕获输出,示例如下(以pytest为例):
captured_replies = [] def capture_send_message(chat_id, text, **kwargs): captured_replies.append({"chat_id": chat_id, "content": text}) # 返回模拟的Message对象避免后续逻辑报错 return Message(message_id=2, chat=chat, date=datetime.now(), text=text) # 替换原生的send_message方法 monkeypatch.setattr(application.bot, "send_message", capture_send_message) # 执行测试逻辑 await application.process_update(mock_update) # 断言返回结果符合预期 assert len(captured_replies) == 1 assert captured_replies[0]["content"] == "预期的返回内容"
补充说明:你之前尝试调用的User.send_message是官方提供的主动向该用户发送私聊消息的接口,本身不具备模拟用户发消息的能力,测试场景无需调用这类真实请求接口。
内容的提问来源于stack exchange,提问作者juju
相关产品推荐
相关产品推荐

