Python单元测试:如何Patch带有注入参数的函数并修改注入参数
Python单元测试:如何Patch带有注入参数的函数并修改注入参数
嗨,我来帮你搞定这个单元测试的问题~
你遇到的核心问题是:原函数function_to_patch不仅会返回值,还会修改传入的Element实例的属性,但你之前只给mock设置了return_value,完全没处理参数修改的逻辑,所以function_to_test里的injected_arg.tags根本没被更新,自然拿不到期望的"tag3"。
解决方法很简单,我们不用只依赖return_value,而是用side_effect给mock绑定一个自定义函数,让它模拟原函数的完整行为——既修改传入的参数,又返回指定值。
修改后的测试代码示例
from unittest import mock, TestCase from your_module import Element, function_to_test # 替换成你的实际模块名 class TestFunctionToTest(TestCase): @mock.patch("your_module.function_to_patch") # 注意这里要写对被patch函数的完整路径 def test_function_to_test(self, patch_of_function_to_patch): # 定义一个模拟函数,复刻原函数对参数的修改逻辑 def mock_func(injected_arg: Element): # 修改传入的Element实例的tags属性 injected_arg.tags = ["tag1", "tag3"] # 返回测试需要的返回值 return ("my return", 3) # 把自定义模拟函数设置为mock的side_effect patch_of_function_to_patch.side_effect = mock_func # 执行待测试函数 result = function_to_test() # 断言结果符合预期 self.assertEqual(result, "tag3")
关键逻辑解释
当function_to_test调用function_to_patch时,mock会触发我们定义的mock_func:
- 它会接收
function_to_test里创建的那个injected_arg实例作为参数; - 按照我们的需求修改这个实例的
tags属性; - 返回预先设定的测试用返回值。
这样function_to_test里的injected_arg就被正确修改了,最后返回的injected_arg.tags[1]就是你期望的"tag3",断言自然能通过。
额外注意事项
- 路径正确性:patch的路径必须是
function_to_test实际导入function_to_patch的路径,比如如果两者在同一个模块,就用__main__.function_to_patch;如果在其他模块,就写模块名.function_to_patch,路径错了mock不会生效。 - 原代码笔误修正:你提供的
function_to_test最后一行写的是return Element.tags[1],这明显是笔误——Element是类,没有tags类属性,应该改成return injected_arg.tags[1],不然哪怕测试逻辑对了,代码本身也会报错。
备注:内容来源于stack exchange,提问作者gerfred
相关产品推荐
相关产品推荐

