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

如何使用unittest对Flask应用做MongoDB mock并测试数据插入功能

Flask单元测试Mock MongoDB实现POST接口校验方案

实现思路

不需要启动真实MongoDB实例,只需Mock业务代码中调用的Mongo集合插入方法,验证该方法是否被正确调用、入参是否符合预期,即可完成「用户是否成功添加到集合」的逻辑测试。

完整测试代码

from unittest import TestCase, main as unittest_main, mock
from bson.objectid import ObjectId
from app import app

sample_user = {
    'Id': ObjectId('5d55cffc4a3d4031f42827a3'),
    'Username': 'LeTest',
    'Mail': 'sendme@gmail.com',
    'password': 'test123',
    'Qrcode': 'TODO'
}

class TestUserPostAPI(TestCase):
    def setUp(self):
        # 初始化Flask测试客户端
        app.config['TESTING'] = True
        self.client = app.test_client()

    # 注意:此处patch的路径需要替换为你业务代码中实际调用的Mongo集合插入方法路径
    # 示例:如果你的app.py中是通过 `user_collection.insert_one()` 执行插入,就填'app.user_collection.insert_one'
    @mock.patch('app.user_collection.insert_one')
    def test_add_user_success(self, mock_insert):
        # 模拟插入成功的返回值,和真实Mongo插入行为保持一致
        mock_insert.return_value.inserted_id = sample_user['Id']

        # 调用POST接口
        response = self.client.post(
            '/user/add', # 替换为你的实际POST接口路径
            json=sample_user
        )

        # 1. 校验接口响应符合预期
        self.assertEqual(response.status_code, 201) # 替换为你接口成功时实际返回的状态码
        resp_data = response.get_json()
        self.assertEqual(resp_data['inserted_id'], str(sample_user['Id']))

        # 2. 校验Mongo插入方法被正确调用,且入参和测试数据一致
        mock_insert.assert_called_once_with(sample_user)

if __name__ == '__main__':
    unittest_main()

注意事项

  • Mock路径必须准确:要Mock你业务代码里实际引入并调用的插入方法,不能直接Mockpymongo.collection.Collection.insert_one,路径错误会导致Mock不生效
  • 如果你的业务逻辑会自动生成Id字段、而非使用请求传入的ID,校验入参时可以用mock.ANY匹配不确定的字段:
    expected_param = {**sample_user, 'Id': mock.ANY}
    mock_insert.assert_called_once_with(expected_param)
    
  • 若需要测试插入失败的场景,可给mock_insert设置抛出异常的行为:mock_insert.side_effect = Exception("Mongo连接异常"),再验证接口是否返回了对应的错误状态码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:18:01