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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:45:33