Pytest Mock/Patch API调用失败,遇列表索引错误求助
Pytest Patch 失效问题解决
错误根源
你碰到的list indices must be integers or slices, not str错误,核心原因是Patch的目标路径写错了——你定义的Mock根本没生效,call_to_api()实际返回了一个列表,导致用字符串索引["status"]时触发类型错误。
核心规则:Patch 要打在「函数被使用的位置」
Patch的路径必须指向被测函数实际调用call_to_api的那个模块位置,而不是call_to_api本身定义的文件。举个实际场景:
假设你的项目结构是:
your_project/ ├── app.py # 包含 tested_function 和 call_to_api └── test_app.py
在test_app.py里你是这么导入被测函数的:
from app import tested_function
那tested_function内部调用的call_to_api,是属于app模块的,所以Patch路径必须写app.call_to_api,而不是你之前用的import_from_same_file.call_to_api。
修正后的测试代码
from unittest.mock import patch from app import tested_function # 这里的app是你的被测模块名 @patch("app.call_to_api") def test_tested_function(mock_api_call): # 设置Mock返回字典,匹配被测函数的取值方式 mock_api_call.return_value = {"status": "COMPLETE"} # 执行被测函数 tested_function() # 可选:验证Mock是否被正确调用 mock_api_call.assert_called_once()
如果想用自定义对象作为返回值,要对应被测函数的取值逻辑:
- 若被测函数是
status = response["status"]:必须返回字典; - 若改成
status = response.status:可以用自定义对象:
class MockResponse: status = "COMPLETE" @patch("app.call_to_api") def test_tested_function(mock_api_call): mock_api_call.return_value = MockResponse() tested_function()
关键注意点
- 永远遵循:Patch where it's used, not where it's defined(补丁打在函数被调用的位置,而非定义位置);
- 即使测试文件和被测函数在同一目录,也要确保Patch路径指向被测函数所在模块的目标函数,而非测试文件内的导入。
内容的提问来源于stack exchange,提问作者Martin W
相关产品推荐
相关产品推荐

