如何正确Mock Path函数的返回对象及其name属性?
如何正确Mock Path对象的name属性?
问题场景
基础业务函数:
def whatever(..): for input_file in files: compressed_file = Path(input_file) if not compressed_file.name.replace('test_', '').startswith(COMPRESSED_FILE_PREFIX): continue
测试代码(原错误写法):
@mock.patch('path_to_Path_function.Path') def test_choose_MFII_files(mock_Path): mock_Path.return_value = 'files/exchange' mock_Path.name.return_value = 'whatever'
运行测试时报错:
AttributeError: 'str' object has no attribute 'name'
解决方法
你需要模拟Path返回的实例对象,而非直接返回字符串。unittest.mock的MagicMock可创建带属性的模拟对象,具体有两种实现方式:
写法1:先创建模拟实例再赋值
from unittest.mock import patch, MagicMock @patch('path_to_Path_function.Path') def test_choose_MFII_files(mock_Path): # 创建模拟的Path实例 mock_path_instance = MagicMock() # 给实例设置name属性 mock_path_instance.name = 'test_compressed_file.txt' # 让Path类返回这个模拟实例 mock_Path.return_value = mock_path_instance # 执行你的测试逻辑...
写法2:链式直接设置返回值的属性
更简洁的方式,直接给mock_Path.return_value绑定name属性:
from unittest.mock import patch @patch('path_to_Path_function.Path') def test_choose_MFII_files(mock_Path): # 直接指定Path实例的name属性值 mock_Path.return_value.name = 'test_compressed_file.txt' # 执行你的测试逻辑...
原理说明
原错误根源是你让mock_Path.return_value返回了字符串'files/exchange',但真实的Path(input_file)返回的是具备name属性的Path对象。因此mock时必须返回一个模拟对象,并为它设置对应属性,才能让业务代码正常访问compressed_file.name。
内容的提问来源于stack exchange,提问作者ifrj
相关产品推荐
相关产品推荐

