当前位置: 首页 > news >正文

【MongoDB实战】8.3 简易商品管理系统-测试与优化 完善版

《MongoDB实战入门》第8章 实战项目1:简易商品管理系统

8.3 简易商品管理系统-测试与优化 完善版

前置说明

本章实战基于Node.js + Mongoose操作MongoDB(需MongoDB 4.0+,事务依赖副本集),先完成基础环境准备:

    1. 安装依赖:npm install mongoose mocha chai --save-dev
    1. 启动MongoDB副本集(事务必备):参考MongoDB官方文档搭建单节点/多节点副本集,命名为rs0
    1. 基础数据模型(models/product.js):定义商品核心字段
// models/product.jsconstmongoose=require('mongoose');// 商品Schema定义constproductSchema=newmongoose.Schema({name:{type:String,required:true,trim:true},// 商品名称category:{type:String,required:true,trim:true},// 商品分类price:{type:Number,required:true,min:0},// 商品价格stock:{type:Number,required:true,min:0,default:0},// 库存(非负)createTime:{type:Date,default:Date.now},// 创建时间updateTime:{type:Date,default:Date.now}// 更新时间});// 预更新钩子:自动更新updateTime(适配高版本Mongoose,移除next参数)productSchema.pre('save',asyncfunction(){this.updateTime=Date.now();});// 导出模型constProduct=mongoose.model('Product',productSchema);module.exports=Product;
  1. MongoDB公共连接配置(utils/db.js,统一管理连接逻辑):
// utils/db.jsconstmongoose=require('mongoose');// 数据库连接配置(统一配置,避免重复编码)constDB_URI='mongodb://localhost:27017,localhost:27018,localhost:27019/product_manage?replicaSet=rs0';async functionconnectDB(){try{// 高版本Mongoose无需useNewUrlParser等废弃选项await mongoose.connect(DB_URI);console.log('MongoDB副本集连接成功');}catch(err){console.error('MongoDB连接失败:',err);process.exit(1);}}// 统一断开连接方法async functiondisconnectDB(){try{await mongoose.disconnect();console.log('MongoDB连接已断开');}catch(err){console.error('MongoDB断开连接失败:',err);}}module.exports={connectDB,disconnectDB};

8.3.1 功能测试:接口调用验证核心功能

测试目标

验证商品「新增、查询、更新库存、删除」核心接口的正确性,采用Mocha+Chai编写单元测试。

测试代码(test/product.test.js
constchai=require('chai');constexpect=chai.expect;constmongoose=require('mongoose');constProduct=require('../models/product');const{connectDB,disconnectDB}=require('../utils/db');// 全局前置:仅连接数据库,不全局清空数据before(async()=>{awaitconnectDB();});// 调整:仅清理测试用例生成的临时数据(不清理核心的10条商品数据)// 临时数据标识:名称包含「测试商品」「待删除商品」beforeEach(async()=>{await Product.deleteMany({name:{$in:['测试商品','待删除商品']}});});// 新增:每个用例结束后,仅清理当前用例的临时数据(进一步保证数据保留)afterEach(async()=>{await Product.deleteMany({name:{$in:['测试商品','待删除商品']}});});// 全局后置:仅断开数据库,不清理核心数据after(async()=>{awaitdisconnectDB();});// 测试套件:商品CRUD功能describe('商品管理系统核心功能测试',()=>{// 用例1:新增商品 - 批量生成10条核心数据(执行后保留)it
http://www.cnnetsun.cn/news/138211.html

相关文章:

  • Nginx云计算大数据——安装AND版本升级(普通升级+平滑升级+失败回滚)
  • GPT-5.2 实测数据流出:逻辑推理性能翻倍,大模型“幻觉”真的被终结了吗?
  • SQL SERVER——通过计划任务方式每月对配置数据、审计数据等进行备份
  • 前端——跨平台桌面应用开发实践
  • OpenAI 的反击!GPT-5.2 强行拉开代差,Gemini 3 和 Claude 4 还有机会吗?
  • 零售打工人加薪难?靠这张证,我在激烈竞争里站稳了脚跟
  • 基于springboot的多媒体素材库的开发与应用毕业论文+PPT(附源代码+演示视频)
  • 从离线语音到多模态智能体四博智联 AI 硬件整体解决方案全景解析
  • 我发现跨医院联合训练让诊断准确率飙升后来才知道是横向联邦学习在数据孤岛中的绝招
  • 性能压测工具:wrk
  • 论文引用标注工具排名2025:6大平台+自动规范推荐
  • Kotaemon AWS EC2部署实例:国际业务首选
  • 实在没货,简历(软件测试)咋写?
  • 网约车服务端线上流量巡检与测试验收技术
  • 公考日记7
  • 火电一次调频、自抗扰调频及群智能算法智能调频在MATLAB/Simulink中的应用
  • 科研实验室温湿度监控新范式:以太网 POE 技术全场景解决方案
  • RV1126 NO.57:ROCKX+RV1126人脸识别推流项目之读取人脸图片并把特征值保存到sqlite3数据库
  • 探索SAR ADC:45nm工艺下的高速高精度设计
  • 【小增长技术团队东哥分享】Electron vs Electron-Vite vs Electron-Egg:桌面端开发到底该选谁?
  • 测试价值的量化评估:从成本中心到价值证明的路径探索
  • 测试领导力:在敏捷洪流中筑造质量堤坝
  • C++常用设计模式
  • Spring Boot 自动配置深度解析:原理、实战与源码追踪
  • 无代码解决方案:破解企业数字化转型效率困局
  • SAM (Segment Anything Model):万物皆可分割-k学长深度学习专栏
  • Mysql 报错 “Public Key Retrieval is not allowed”
  • 熊市中最适用的公式==底部建仓
  • 100G双光口网卡技术解析:Intel E810-CAM2方案的性能与应用突破
  • BioSIM抗人组蛋白H1抗体SIM0385:广泛应用于表观遗传学、染色质结构分析等领域