unittest mock响应测试createData方法仍生成数据库数据问题咨询
问题根因分析
- 错误1:执行顺序完全颠倒。你写的
data.createData(data, goodContent).return_value = mock_response会先真实调用createData方法,触发内部的requests.post请求向接口写数据,之后再给已经生成的返回值设置return_value,这步操作没有任何意义,真实请求早就已经发送完成了。 - 错误2:Mock对象选择错误。你要拦截真实的HTTP请求,应该Mock的是
createData内部依赖的requests.post方法,而不是尝试修改createData的返回值。
正确实现示例
你可以使用unittest.mock.patch装饰器/上下文管理器直接替换掉createData方法中调用的requests.post,避免真实请求发出:
import unittest, logging import requests from data import Data from unittest.mock import patch, Mock class TestData(unittest.TestCase): def testCreateDataSuccess(self): test_data = Data() mock_response = Mock() mock_response.status_code = 201 # 替换requests.post,不会触发真实请求 with patch.object(requests, 'post', return_value=mock_response), self.assertLogs() as captured: resp = test_data.createData(goodContent) # 验证返回值符合预期 self.assertEqual(201, resp.status_code) # 验证日志输出正确 self.assertEqual(captured.records[0].message, "Creating data...") self.assertEqual(captured.records[1].levelname, 'INFO') self.assertEqual(captured.records[1].message, "Data created") # 验证requests.post确实按预期参数调用 requests.post.assert_called_once_with(test_data.url, data=goodContent)
失败场景只要把mock_response的status_code改成非201的值即可,全程不会有真实请求发出,自然不会生成数据库数据。
内容的提问来源于stack exchange,提问作者Menryck
相关产品推荐
相关产品推荐

