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

Django Rest单元测试如何Mock第三方API GET请求解决下标报错

实现步骤

首先导入Mock依赖:

from unittest.mock import patch, MagicMock

你可以选择以下两种方案之一实现,根据测试需求选择即可:


方案1:直接Mock get_data_request 方法(最简方案)

不需要关心内部Celery任务的执行逻辑,直接让get_data_request返回你期望的业务数据即可:

# 替换路径为你ViewSet所在模块的APIServiceRequestRouter引用路径
@patch('myapp.views.APIServiceRequestRouter.get_data_request')
def test_valid_deploy(self, mock_get_data) -> None:
    """测试合法的deploy请求"""
    # 按业务需要配置mock返回的item_list结构
    mock_get_data.return_value = [
        {"id": 1, "name": "测试服务1"},
        {"id": 2, "name": "测试服务2"}
    ]

    response = self.client.patch(
        reverse('services-deploy', kwargs={'pk': self.service2.pk}),
        data=json.dumps(self.deploy_payload),
        content_type='application/json'
    )
    self.assertEqual(response.status_code, status.HTTP_206_PARTIAL_CONTENT)
    # 可选校验:确认方法被正常调用
    mock_get_data.assert_called_once()

方案2:Mock Celery任务http_get_request(细粒度控制方案)

如果你需要校验请求的第三方地址、参数等细节,可以直接Mock Celery任务的执行:

# 替换路径为get_data_request方法所在模块的http_get_request引用路径
@patch('myapp.utils.http_get_request.delay')
def test_valid_deploy(self, mock_delay) -> None:
    """测试合法的deploy请求"""
    # 构造Mock的异步任务返回对象
    mock_task = MagicMock()
    # 配置get方法返回你需要的响应结构,和实际第三方返回格式一致即可
    mock_task.get.return_value = {
        "item_id": [101, 102, 103],
        # 其他你业务逻辑需要用到的字段
    }
    mock_delay.return_value = mock_task

    response = self.client.patch(
        reverse('services-deploy', kwargs={'pk': self.service2.pk}),
        data=json.dumps(self.deploy_payload),
        content_type='application/json'
    )
    self.assertEqual(response.status_code, status.HTTP_206_PARTIAL_CONTENT)
    # 可选校验:确认Celery任务被调用,且传入的API地址正确
    mock_delay.assert_called_once_with("你预期的第三方API请求地址")

注意事项

  • Mock路径规则:要写方法被实际调用的模块路径,不是类/方法定义所在的原始路径。比如你在views.py里导入并使用了APIServiceRequestRouter,就Mockviews.py下的这个引用路径即可。
  • 返回值结构要和实际业务逻辑需要的格式完全匹配,避免后续取值报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 15:45:04