Python单元测试:Mock对象Ps属性设置无效,函数返回空集合求助
问题排查与修复方案
核心错误点
- 测试方法不符合unittest规范:方法名未遵循
test_开头的规则,且错误地将TestCase作为参数传入方法,正确做法是让测试类继承unittest.TestCase。另外你误用了@patch装饰器,后续还直接覆盖了mock_input变量,完全浪费了patch的作用。 - Mock属性设置错误:原函数中
input.Ps是一个属性(不是可调用方法),但你用了给方法设置返回值的mock_input.Ps.return_value写法,属性应该直接赋值。 - 其他细节问题:
import my_func应放在文件顶部而非方法内部;Python3中集合字面量推荐用{'name1', 'name2'}而非set(['name1', 'name2'])。
修复后的测试代码
import unittest from unittest.mock import MagicMock from dataclasses import dataclass # 替换为my_func实际所在的模块路径 from your_module import my_func @dataclass class TestClass: name: str class TestMyFunc(unittest.TestCase): def test_my_func(self): mock_input = MagicMock() p1 = TestClass('name1') p2 = TestClass('name2') # 直接给Ps属性赋值,而非使用return_value mock_input.Ps = (p1, p2) expected_result = {'name1', 'name2'} self.assertEqual(my_func(mock_input), expected_result) if __name__ == '__main__': unittest.main()
修复说明
- 调整测试类与方法结构,符合unittest标准写法,确保测试框架能正确识别并执行测试。
- 修正Mock属性赋值逻辑:因为原函数直接访问
input.Ps属性,所以直接给mock_input.Ps赋值即可,return_value仅用于模拟可调用方法的返回值。 - 移除无用的
@patch装饰器,此处不需要patch外部模块,直接创建MagicMock对象即可满足测试需求。
内容的提问来源于stack exchange,提问作者Lily Jinjia Li
相关产品推荐
相关产品推荐

