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

如何为Python的Downloader.downloadFiles函数编写Mock单元测试并解决报错

解决Mock Downloader.downloadFiles时的AttributeError问题

问题场景

我在downloadModule模块中调用result = Downloader.downloadFiles(list_to_download, download_path, username, password),这个函数会返回布尔值True/False。想编写Mock让它始终返回True,但用以下代码时触发错误:AttributeError: 'function' object has no attribute 'rsplit'

错误代码:

@patch(downloadModule.Downloader.downloadFiles)
def test_download_files(self,mock_download_files):
        mock_download_files.return_value = True
        self.assertEqual(downloadModule.Downloader.downloadFiles(),True)

错误原因

@patch装饰器要求传入字符串格式的模块-类-函数路径,而不是直接传入函数对象。patch内部需要通过字符串解析目标对象的位置,直接传函数对象会导致它尝试对函数执行字符串拆分操作(比如rsplit),从而抛出这个属性错误。

修正后的代码

把@patch的参数改成字符串形式的路径,同时调用mock函数时尽量传入符合原函数签名的参数(mock会忽略参数值,只返回预设结果):

from unittest.mock import patch
import downloadModule
import unittest

class TestDownload(unittest.TestCase):
    @patch('downloadModule.Downloader.downloadFiles')
    def test_download_files(self, mock_download_files):
        mock_download_files.return_value = True
        # 传入符合原函数参数要求的占位值
        result = downloadModule.Downloader.downloadFiles([], "", "", "")
        self.assertEqual(result, True)

补充说明

  • 必须用字符串路径指定要Mock的对象,这样patch才能正确定位并替换目标函数。
  • 调用Mock后的函数时,传入匹配原函数签名的参数能让测试更贴近实际调用场景,避免潜在的参数不兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:45:44