如何在NestJs中使用Jest测试Mongoose Schema Decorator
Jest测试Mongoose Schema Decorator 实操建议
环境准备
- 确保项目依赖齐全:安装
jest、mongoose以及你用到的装饰器库(比如@nestjs/mongoose、mongoose-decorators),同时补充类型包@types/jest、@types/mongoose保证TypeScript语法提示 - 全局处理Mongoose连接:在
jest.setup.js里统一配置测试前后的数据库连接与清理,避免每个测试文件重复操作:
const mongoose = require('mongoose'); beforeAll(async () => { await mongoose.connect('mongodb://localhost:27017/test_schema_db'); }); afterAll(async () => { await mongoose.connection.dropDatabase(); await mongoose.connection.close(); });
核心测试方向
1. 校验Schema结构正确性
测试装饰器生成的Schema是否和预期一致,重点验证字段的类型、必填规则、默认值、索引等配置:
import { UserModel } from './user.model'; describe('User Schema', () => { test('字段配置符合预期', () => { const schema = UserModel.schema; // 校验username字段 const usernamePath = schema.path('username'); expect(usernamePath.instance).toBe('String'); expect(usernamePath.isRequired).toBe(true); // 校验isActive字段默认值 const isActivePath = schema.path('isActive'); expect(isActivePath.defaultValue).toBe(false); }); });
2. 测试数据校验逻辑
验证装饰器定义的校验规则是否生效,比如必填字段缺失、类型不匹配时能否抛出正确错误:
test('缺失必填字段无法保存', async () => { const invalidUser = new UserModel({ isActive: true }); let saveError; try { await invalidUser.save(); } catch (err) { saveError = err; } expect(saveError).toBeDefined(); expect(saveError.errors.username.message).toMatch(/required/); }); test('类型不匹配时抛出错误', async () => { const invalidUser = new UserModel({ username: 'test', isActive: 'not-a-bool' }); let validationError; try { await invalidUser.validate(); } catch (err) { validationError = err; } expect(validationError).toBeDefined(); expect(validationError.errors.isActive.kind).toBe('Boolean'); });
3. 特殊场景测试
- 索引与唯一性校验:如果用装饰器配置了唯一索引,测试重复数据插入是否触发错误
- 中间件/自动字段:比如配置
timestamps: true,验证文档保存时createdAt、updatedAt是否自动生成 - 嵌套文档/关联模型:测试嵌套类装饰器生成的子Schema,或者引用其他模型的关联关系是否正确
实用技巧
- 每个测试用例后清理数据:用
afterEach钩子清空集合,避免测试数据互相干扰:
afterEach(async () => { await UserModel.deleteMany({}); });
- 禁用Mongoose日志:测试时可以关闭Mongoose的调试日志,减少输出干扰:
mongoose.set('debug', false); - 用内存数据库提速:可以用
mongodb-memory-server替代本地MongoDB,避免环境依赖,加快测试运行速度
内容的提问来源于stack exchange,提问作者mat.twg
相关产品推荐
相关产品推荐

