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

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:

  1. 它会接收function_to_test里创建的那个injected_arg实例作为参数;
  2. 按照我们的需求修改这个实例的tags属性;
  3. 返回预先设定的测试用返回值。

这样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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:42:58