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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 08:27:01