如何用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
相关产品推荐
相关产品推荐

