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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:27:03