如何在NestJS+TypeOrm测试中Mock实体关系 避免导入全量关联实体
解决方案
针对NestJS集成TypeORM测试时无需导入全量关联实体的需求,可根据你的测试场景选择以下两种方案:
方案1:最小化Mock关联实体(适用测试逻辑不涉及关联操作场景)
如果你的测试用例完全不会查询、写入customer关联字段,只需定义空的Mock实体满足TypeORM的元数据扫描要求即可,无需导入原实体及它的关联链:
// 测试代码顶部定义Mock关联实体 import { Entity } from 'typeorm'; @Entity('customer') class MockCustomerEntity {} const module: TestingModule = await Test.createTestingModule({ imports: [ TypeOrmModule.forRoot({ ...CONNECTION_OPTIONS, // 测试推荐搭配内存数据库配置,提升执行速度 type: 'sqlite', database: ':memory:', dropSchema: true, synchronize: true, entities: [WalletEntity, WalletTransactionEntity, MockCustomerEntity] }), TypeOrmModule.forFeature([WalletEntity, WalletTransactionEntity]), ], providers: [WalletService], }).compile();
该方案无需修改原实体代码,Mock实体仅用来填充元数据缺口,不会影响业务逻辑,也不需要处理原关联实体的嵌套关联关系。
方案2:Mock原实体导入(适用测试逻辑涉及部分关联字段场景)
如果你的测试逻辑需要用到customer关联的部分字段,可通过jest.mock覆盖原实体的导入,自定义保留需要的字段,删除不需要的嵌套关联:
// 测试代码最顶部添加jest.mock,覆盖原CustomerEntity的引入 jest.mock('./path/to/real/customer.entity', () => { import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; @Entity('customer') class MockCustomerEntity { @PrimaryGeneratedColumn('uuid') id: string; // 仅添加测试需要用到的字段,无需保留原实体的其他关联装饰器 @Column() name: string; } return { CustomerEntity: MockCustomerEntity }; }); // 后续模块初始化逻辑保持原有代码即可
该方案可以按需保留需要的实体字段,同时完全剔除不需要的嵌套关联,避免导入全量关联链实体。
内容的提问来源于stack exchange,提问作者Matt Koevort
相关产品推荐
相关产品推荐

