Python单元测试:Mock函数返回指定Mock对象的问题及优化问询
你的问题解决啦!
首先说为啥你原来的代码不管用:unittest.mock.Mock对魔术方法(比如__call__)的处理有点特殊——当你去赋值fn.__call__的时候,其实只是给这个Mock对象加了个名为__call__的属性,但Mock本身的调用逻辑(就是你写fn()的时候触发的行为)根本不会用到这个属性。它内部是靠自己的机制处理调用的,所以你设置的fn.__call__.return_value完全没生效。
正确的写法超简单
想要让Mock函数调用时返回你指定的另一个Mock,直接设置return_value就好,根本不用折腾__call__:
from unittest.mock import Mock my_mock = Mock() # 直接在创建时指定返回值 fn = Mock(return_value=my_mock) # 测试一下 result = fn() print(result is my_mock) # 输出 True,说明返回的就是我们要的my_mock
要是你已经先创建了fn,事后改也没问题:
fn.return_value = my_mock
这样调用fn()就会准确返回你预先定义的my_mock了。
实现你想要的简洁写法
如果你想写成fn = MockFunction(my_mock)这种形式,自己封装个小工厂函数就行:
from unittest.mock import Mock def MockFunction(return_obj): return Mock(return_value=return_obj) # 用起来就像你想要的那样 my_mock = Mock() fn = MockFunction(my_mock) # 验证一下 assert fn() is my_mock # 断言通过,没问题
这个函数就是对Mock(return_value=...)的简单包装,完全符合你的需求,用起来更直观。
再补一句为啥原来的方法不行
unittest.mock.Mock的魔术方法是通过动态属性访问来处理的,直接赋值__call__并不会覆盖它真正的调用行为。Mock的__call__逻辑是内置的,你手动加的那个__call__ Mock根本不会被用到。所以官方推荐的方式就是用return_value,既简单又靠谱。
内容的提问来源于stack exchange,提问作者Pig
相关产品推荐
相关产品推荐

