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

