NestJs+Jest项目中toBeInstanceOf测试无法通过的问题求助
问题分析与解决思路
你的测试失败核心原因是:toBeInstanceOf(User) 检查的是对象的原型链,但你在测试中用对象字面量创建的fakeUser和newUser,本质是普通Object实例,并非User类的实例。TypeScript的类型注解/断言仅在编译阶段生效,运行时这些对象的原型链并不指向User构造函数,因此Jest的toBeInstanceOf断言会失败。
具体解决方案
1. 修复测试中User实例的创建方式
不要用对象字面量模拟User,改用new User()创建实例后再赋值属性:
修改测试代码中的fakeUser和repository里的newUser:
// 替换原fakeUser的定义 const fakeUser = new User(); fakeUser.id = 1; fakeUser.uuid = 'some-uuid'; fakeUser.createdAt = new Date(); fakeUser.updatedAt = new Date(); fakeUser.email = ''; fakeUser.password = ''; // 替换repository.insert中的newUser创建逻辑 repository = { insert: jest.fn((entity: User) => { const newUser = new User(); // 用Object.assign继承fakeUser的属性并覆盖传入的email/password Object.assign(newUser, fakeUser, { email: entity.email, password: entity.password, }); return Promise.resolve(newUser); }), } as IRepository<User>;
2. 确保User是类而非纯接口
检查你的user.entity.ts,确保User是类(继承自BaseEntity),而不是仅定义类型的接口。如果是接口,编译后会被完全移除,运行时不存在User构造函数,toBeInstanceOf自然无法生效。
示例User类结构:
// user.entity.ts import { BaseEntity } from './base.entity'; export class User extends BaseEntity { id: number; uuid: string; createdAt: Date; updatedAt: Date; email: string; password: string; }
3. 可选:优化测试断言逻辑
如果你的业务场景中,User实体不需要严格的类实例(比如只是数据传输对象),可以放弃toBeInstanceOf,改用属性检查来验证类型:
// 替换原toBeInstanceOf断言 expect(createdUser).toHaveProperty('id'); expect(createdUser).toHaveProperty('email'); expect(typeof createdUser.email).toBe('string');
内容的提问来源于stack exchange,提问作者Jérémie Dutheil
相关产品推荐
相关产品推荐

