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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:41:17