如何为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
相关产品推荐
相关产品推荐

