You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3如何正确mock MagicMock对象的__bytes__方法?

问题根源

你的写法有两个核心问题:

  1. Python 本身对双下划线包裹的魔术方法采用类型级查找规则:调用bytes(obj)时,解释器不会去obj的实例属性里找__bytes__,而是直接查找type(obj)即类层面定义的__bytes__方法,你直接给实例赋值my_mock.__bytes__本质是给实例加了个普通属性,根本不会被bytes()调用命中。
  2. MagicMock 对所有魔术方法的mock做了特殊的内部存储处理,直接给实例属性赋值魔术方法不会更新它的内部mock配置,最终调用的还是MagicMock类自带的默认__bytes__实现——这个默认实现的返回值正好就是b'\x00',也就是你看到的异常输出。
修复方案

不要直接给实例赋值魔术方法,用MagicMock提供的配置方式设置__bytes__即可,两种常用写法:

  • 方法1:实例创建后用configure_mock配置
from unittest.mock import MagicMock, Mock

my_mock = MagicMock()
my_mock.configure_mock(**{"__bytes__": Mock(return_value=b"\x01\x02\x03")})
print(bytes(my_mock))  # 正常输出 b'\x01\x02\x03'
  • 方法2:初始化MagicMock时直接传入配置参数
from unittest.mock import MagicMock, Mock

my_mock = MagicMock(**{"__bytes__": Mock(return_value=b"\x01\x02\x03")})
print(bytes(my_mock))  # 正常输出 b'\x01\x02\x03'

补充说明:不止__bytes__,所有Python魔术方法(比如__str__、__iter__、__enter__等)在使用Mock对象模拟时,都要遵循上述配置规则,直接给实例赋值双下划线魔术方法都不会生效。

内容的提问来源于stack exchange,提问作者Oran Can Ören

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:36:23