使用unittest.mock.patch模拟函数失败,抛出ValueError异常
解决Python Azure函数单元测试中的Mock拆包错误
你遇到的ValueError: not enough values to unpack (expected 2, got 0)问题,根源在于两个关键的mock配置错误,我来一步步帮你修复:
1. 直接原因:Mock返回值格式不匹配
你的main.py中,get_ProjectList()方法返回的是一个二元元组(response, status_code),代码通过拆包来获取这两个值:
response, status_code = ProjectList().get_ProjectList()
但你当前的mock设置是给Mock对象添加status_code属性,而不是返回符合要求的元组:
mock_get.return_value.status_code = 200
这会导致get_ProjectList()返回一个空的Mock对象,无法拆成两个值,直接触发错误。
修复方法:让mock返回正确的元组格式:
mock_get.return_value = ("模拟的项目列表响应", 200)
2. 关键细节:Mock的目标路径不正确
Python的mock是基于对象的导入路径生效的。你在main.py中用from api.ProjectFolder.ProjectDetails import *把ProjectList导入到了GetProjectList.main模块的命名空间里,此时代码实际调用的是main.py本地的ProjectList类,而不是原模块的。
你原来的mock路径指向了原模块的类:
mock.patch('api.ProjectFolder.ProjectDetails.ProjectList.get_ProjectList')
这会导致mock无法作用到main.py中实际使用的ProjectList实例,相当于mock了一个“无效的目标”。
修复方法:修改mock路径为main.py中ProjectList的实际路径:
mock.patch('GetProjectList.main.ProjectList.get_ProjectList')
修改后的完整测试代码
from unittest import mock import unittest from GetProjectList.main import * import azure.functions as func class Test_ProjectDetails(unittest.TestCase): def test_ProjectDetails(self): # 修正mock路径为main.py中的ProjectList.get_ProjectList with mock.patch('GetProjectList.main.ProjectList.get_ProjectList') as mock_get: # 修正返回值为二元元组,匹配main.py的拆包逻辑 mock_get.return_value = ("模拟的项目列表内容", 200) req = func.HttpRequest( method='GET', body=None, url='/GetProjectList' ) resp = main(req) expected_status_code = 200 self.assertEqual(resp.status_code, expected_status_code) if __name__ == '__main__': unittest.main()
额外提示
- 尽量避免使用
from ... import *的导入方式,明确导入需要的类(比如from api.ProjectFolder.ProjectDetails import ProjectList),这样mock路径会更清晰,也能减少命名冲突。 - 测试前可以打印一下
ProjectList.__module__来确认它的实际模块路径,确保mock路径正确。
内容的提问来源于stack exchange,提问作者Sud
相关产品推荐
相关产品推荐

