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

如何正确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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:22:20