Python3如何正确mock MagicMock对象的__bytes__方法?
问题根源
你的写法有两个核心问题:
- Python 本身对双下划线包裹的魔术方法采用类型级查找规则:调用
bytes(obj)时,解释器不会去obj的实例属性里找__bytes__,而是直接查找type(obj)即类层面定义的__bytes__方法,你直接给实例赋值my_mock.__bytes__本质是给实例加了个普通属性,根本不会被bytes()调用命中。 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
相关产品推荐
相关产品推荐

