将MagicMock实例赋值给另一MagicMock的return_value后名称异常问题
关于MagicMock实例方法返回值名称变化的疑问解答
首先得告诉你,这其实是MagicMock的内置追踪机制在起作用,完全不是你的代码写错啦!
为什么g的名称会变成mock.goo()?
当你把g赋值给f.goo.return_value时,MagicMock会自动给这个返回值的实例关联父Mock的调用上下文——简单说就是给g的name属性更新成父Mock的方法调用路径,这样后续你调试、查看Mock调用记录的时候,能一眼看出来这个Mock实例是从哪个方法返回的,方便追踪调用链路。
你可以仔细对比一下g的id,从头到尾都是同一个值,说明实例本身根本没被修改或替换,只是它的元数据(name属性)被MagicMock做了关联标记而已。
关于调用f.goo(1,2)的补充说明
不管你给f.goo传什么参数,它返回的始终是你设置的g实例。而且因为之前已经关联了上下文,g的名称不会再因为这次调用改变,同时f.goo的调用记录会被完整保存下来——你可以通过f.goo.call_args查看刚才传入的(1,2)参数,验证调用是否被正确记录。
给你补个验证的小例子:
import mock f = mock.MagicMock() g = mock.MagicMock() print("初始g的name:", g.name) # 输出类似 'mock' print("初始g的id:", id(g)) f.goo.return_value = g print("赋值后g的name:", g.name) # 输出 'mock.goo()' print("赋值后g的id:", id(g)) # 和初始id完全一致 f.goo(1,2) print("调用f.goo后返回的实例id:", id(f.goo(1,2))) # 还是同一个g的id print("f.goo的调用参数:", f.goo.call_args) # 输出 call((1, 2), {})
内容的提问来源于stack exchange,提问作者Lan Do
相关产品推荐
相关产品推荐

