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

测试时如何替换内部函数调用并使其返回预设默认值,无需修改原代码

可以实现,用Python标准库自带的unittest.mock模块的打桩能力即可,不需要修改任何原有业务代码,测试逻辑和业务逻辑完全隔离,测试完成后自动恢复原函数逻辑,不会留下临时修改的遗留问题。

核心注意点:打桩的路径必须匹配func函数实际引用func2的路径,而不是func2原始定义的路径,这是最容易踩坑的地方。

假设你的业务代码存放在module_a.py中,内容如下:

# module_a.py
def func2():
    # 原有对接未上线API的HTTP请求逻辑,测试时不会实际执行
    pass

def func(o_dict):
    id = o_dict.get("id")
    res = func2()  # 内部调用func2
    # 此处省略后续业务逻辑
    return res

pytest 测试用例写法

# test_func.py
from unittest.mock import patch
from module_a import func

def test_func():
    # 按实际引用路径patch func2,指定固定返回值200
    with patch("module_a.func2", return_value=200) as mock_func2:
        test_input = {"id": "test_001"}
        res = func(test_input)
        # 验证返回结果符合预期
        assert res == 200
        # 可选:验证func2确实被调用了
        mock_func2.assert_called_once()

unittest 测试类写法

# test_func.py
import unittest
from unittest.mock import patch
from module_a import func

class TestFunc(unittest.TestCase):
    # 给整个测试用例打桩func2,mock对象作为参数传入方法
    @patch("module_a.func2")
    def test_func(self, mock_func2):
        # 指定mock返回值
        mock_func2.return_value = 200
        test_input = {"id": "test_001"}
        res = func(test_input)
        self.assertEqual(res, 200)
        mock_func2.assert_called_once()

if __name__ == "__main__":
    unittest.main()

如果需要让测试类下所有测试用例都默认让func2返回200,可以把patch装饰器写在测试类上:

@patch("module_a.func2", return_value=200)
class TestFunc(unittest.TestCase):
    def test_func_case1(self, mock_func2):
        # 该用例下func2默认返回200,无需重复设置
        test_input = {"id": "test_001"}
        res = func(test_input)
        self.assertEqual(res, 200)
    
    def test_func_case2(self, mock_func2):
        # 也可以单独修改该用例的返回值
        mock_func2.return_value = 500
        test_input = {"id": "test_002"}
        res = func(test_input)
        self.assertEqual(res, 500)

内容的提问来源于stack exchange,提问作者בני

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 04:57:01