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

如何用Jest测试基于TypeScript装饰器的Mongoose Schema字段校验逻辑

问题原因

你实例化的是@Schema()装饰器修饰的普通TS类User,不是Mongoose Model生成的文档实例,因此不存在validate实例方法。

正确实现方式

首先需要用你导出的UserSchema创建Mongoose Model,再通过Model生成文档实例进行校验,同时注意validate方法校验失败时会主动抛出异常,不会返回错误对象:

import { User, UserDocument, UserSchema } from '../user.schema';
import { model } from 'mongoose';

// 基于Schema创建Mongoose Model
const UserModel = model<UserDocument>('User', UserSchema);

describe('User', () => {
  let user: UserDocument;

  beforeEach(() => {
    // 由Model创建的实例才会携带Mongoose内置的校验等方法
    user = new UserModel() as UserDocument;
  });

  describe('firstName字段校验', () => {
    it('包含非英文字符时校验失败', async () => {
      user.firstName = 'J0hn';
      // 直接断言校验方法抛出异常即可
      await expect(user.validate()).rejects.toBeTruthy();
    });

    // 补充正向用例覆盖合法场景
    it('仅包含英文字符时校验通过', async () => {
      user.firstName = 'John';
      await expect(user.validate()).resolves.not.toThrow();
    });
  });
});

如果需要更精准的断言错误类型,可以捕获异常后判断错误字段信息:

it('包含非英文字符时抛出正则匹配错误', async () => {
  user.firstName = 'J0hn';
  try {
    await user.validate();
    // 未抛出异常则用例直接失败
    expect.fail('校验未抛出预期错误');
  } catch (err) {
    expect(err.errors.firstName.kind).toBe('regexp');
    expect(err.errors.firstName.path).toBe('firstName');
  }
});

内容的提问来源于stack exchange,提问作者natikos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:54:04