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

不修改Python Person类代码,如何修复operator.add的mock测试问题?

解决方法

问题出在patch的目标路径不对:

  • Person类通过from operator import add把add直接导入了自身所在模块的命名空间,后续调用的是这个本地引用的add,而非operator.add。你之前patchoperator.add,不会影响到Person类里已经绑定的那个add对象。

不需要修改Person类,只要调整测试代码里的@patch目标路径,改成**Person类所在模块中的add**即可。另外测试代码里还有个小错误:你创建的是局部变量test_person,但后面用了self.test_person,这会导致AttributeError,得改成直接用test_person。

假设你的Person类在your_module.py文件中,修改后的测试代码如下:

from unittest import TestCase, patch
from your_module import Person  # 导入Person类所在的模块

class PersonTests(TestCase):
    # 这里patch的是Person所在模块里的add,而非operator.add
    @patch('your_module.add')
    def test_age_in_a_decade(self, mock_add) -> None:
        test_person = Person(age=51)
        mock_add.return_value = 61
        age_10 = test_person.age_in_a_decade  # 修正:去掉self.
        self.assertEqual(age_10, 61)
        mock_add.assert_called_once_with(10, 51)

核心逻辑就是:patch的目标必须是被测试代码实际引用的那个对象的位置,而不是原模块的位置。当用from X import Y导入时,Y会被复制到当前模块的命名空间,所以要patch当前模块里的Y。

内容的提问来源于stack exchange,提问作者Dragonariam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:43:25