Flask接口单元测试:跨函数调用requests请求Mock失效求助
问题排查与解决
你的Mock失效核心原因是:被测脚本myscript.py中导入的requests和测试脚本里patch的全局requests不是同一个引用。当functionB调用requests.get时,它用的是自己模块内导入的requests实例,而非测试中被patch的那个。
解决步骤
1. 修正Patch目标
把测试中的@patch.object(requests, 'get')替换为patch被测脚本内的requests对象:
from unittest.mock import patch from src.routes.CRUD import myscript # 确保能正确导入被测模块 # 重点:patch的是myscript模块里的requests.get @patch.object(myscript.requests, 'get') def test_functionA(self, mock_requests): # 后续逻辑...
2. 修正Mock返回值的设置
你之前对Mock返回值的写法有误,正确的设置方式应该是先给mock_requests的return_value设置属性,再指定json()的返回值:
# 模拟响应对象的status_code和json()返回值 mock_response = mock_requests.return_value mock_response.status_code = 201 mock_response.json.return_value = {"some": "value"} # 直接传字典,不需要json.dumps
3. 完整修正后的测试代码
import json from unittest.mock import patch, Mock from src.routes.CRUD import myscript from your_flask_app_module import create_app # 替换为你创建Flask app的方式 import unittest class TestMyEndpoint(unittest.TestCase): def setUp(self): self.app = create_app() self.client = self.app.test_client() @patch.object(myscript.requests, 'get') def test_functionA(self, mock_requests): # 配置Mock响应 mock_response = Mock() mock_response.status_code = 201 mock_response.json.return_value = {"some": "value"} mock_requests.return_value = mock_response data = {'some': 'data'} headers = {'Authorization': 'Bearer somekey'} result = self.client.post( '/myendpoint', data=data, follow_redirects=True, content_type='multipart/form-data', headers=headers ) # 验证Mock被调用 mock_requests.assert_called_once() self.assertEqual(result.status_code, 201)
额外注意事项
- 确保测试脚本能正确导入
src目录下的模块:可以在myproject目录下创建__init__.py,或者在测试脚本开头添加路径配置(比如sys.path.append(os.path.abspath('../src'))) - 如果你用的是蓝图,确保在创建测试用app时正确注册了蓝图
内容的提问来源于stack exchange,提问作者Derek1st
相关产品推荐
相关产品推荐

