如何使用Jest在测试中向Node.js控制器发送数据验证入库逻辑?
实现步骤
你可以按照以下步骤完成测试用例编写:
- 先安装测试所需依赖:
npm install --save-dev supertest jest mongodb-memory-server
- 配置Jest测试环境,新增
jest.config.js指定测试启动前的初始化文件:
module.exports = { testEnvironment: 'node', setupFilesAfterEnv: ['./jest.setup.js'] };
- 新增
jest.setup.js,配置测试用的内存MongoDB,避免污染真实数据库:
import { MongoMemoryServer } from 'mongodb-memory-server'; import mongoose from 'mongoose'; let mongoServer; beforeAll(async () => { mongoServer = await MongoMemoryServer.create(); const mongoUri = mongoServer.getUri(); await mongoose.connect(mongoUri); }); afterEach(async () => { // 每次测试后清空所有集合数据 const collections = mongoose.connection.collections; for (const key in collections) { await collections[key].deleteMany({}); } }); afterAll(async () => { await mongoose.connection.dropDatabase(); await mongoose.connection.close(); await mongoServer.stop(); });
- 编写测试用例文件
auth/signup.test.js:
import request from 'supertest'; import express from 'express'; import initAuthRoutes from '../../controller.js'; // 导入你的控制器文件 import User from '../../models/User.js'; // 导入你的用户Model // 初始化express app const app = express(); app.use(express.json()); initAuthRoutes(app); describe('用户注册接口测试', () => { it('提交合法参数时,用户数据应该正确存入数据库', async () => { // 构造测试参数 const testUser = { phone: '13800138000', password: 'Test123456', name: '测试用户', gender: '男', dob: '1999-01-01' }; // 发送请求,注意接口有multer接收头像,用supertest的attach方法传文件 const res = await request(app) .post('/auth/signup') .attach('photo', `${__dirname}/test-avatar.jpg`) // 可以放一张测试用的占位图片 .field('phone', testUser.phone) .field('password', testUser.password) .field('name', testUser.name) .field('gender', testUser.gender) .field('dob', testUser.dob); // 校验接口返回是否符合预期 expect(res.statusCode).toBe(200); expect(res.body.uid).toBeDefined(); expect(res.body.message).toBe('注册成功'); // 校验数据库中是否存在对应数据 const savedUser = await User.findOne({ phone: testUser.phone }); expect(savedUser).toBeDefined(); expect(savedUser.name).toBe(testUser.name); expect(savedUser.gender).toBe(testUser.gender); expect(savedUser.dob).toBe(testUser.dob); }); // 也可以补充参数缺失的异常测试用例 it('缺少必填参数时,接口应该返回校验错误', async () => { const res = await request(app) .post('/auth/signup') .attach('photo', `${__dirname}/test-avatar.jpg`) .field('phone', '13800138001'); // 故意不传其他必填参数 expect(res.statusCode).toBe(400); }); });
- 最后在
package.json中添加测试命令:
{ "scripts": { "test": "jest" } }
运行npm test即可执行测试。
内容的提问来源于stack exchange,提问作者alesx
相关产品推荐
相关产品推荐

