测试时如何替换内部函数调用并使其返回预设默认值,无需修改原代码
可以实现,用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,提问作者בני
相关产品推荐
相关产品推荐

