不修改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
相关产品推荐
相关产品推荐

