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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:54:16