如何使用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你业务代码里实际引入并调用的插入方法,不能直接Mock
pymongo.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
相关产品推荐
相关产品推荐

