NestJS+TypeORM场景下如何Mock函数内部第一个查询返回的id变量
解决方案
错误原因:你的dataRepository.create方法的Mock实现没有返回携带id字段的对象,导致后续构造data2参数时data.id为undefined,触发写入失败。
下面是完整的测试实现步骤:
1. 初始化测试模块并Mock依赖Repository
在测试文件中对两个依赖的Repository做Mock,核心是给第一个Repository的create方法指定返回值,携带你预设的id值:
import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; // 替换为你实际的Service、实体类型 import { YourService } from './your.service'; import { DataEntity } from './entities/data.entity'; import { Data2Entity } from './entities/data2.entity'; // 预设模拟返回的id值 const MOCK_GENERATED_DATA_ID = 1001; describe('YourService', () => { let service: YourService; let mockDataRepo: jest.Mocked<Repository<DataEntity>>; let mockData2Repo: jest.Mocked<Repository<Data2Entity>>; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ YourService, { provide: getRepositoryToken(DataEntity), useValue: { // 核心逻辑:mock create方法返回带id的实体对象 create: jest.fn().mockResolvedValue({ id: MOCK_GENERATED_DATA_ID, // 可补充其他实体需要的字段避免类型错误 }), }, }, { provide: getRepositoryToken(Data2Entity), useValue: { create2: jest.fn().mockResolvedValue({}), // 按需设置返回值 }, }, ], }).compile(); service = module.get<YourService>(YourService); mockDataRepo = module.get(getRepositoryToken(DataEntity)) as jest.Mocked<Repository<DataEntity>>; mockData2Repo = module.get(getRepositoryToken(Data2Entity)) as jest.Mocked<Repository<Data2Entity>>; });
2. 编写测试用例
除了验证方法正常执行,还可以增加断言验证两次写入的调用参数符合预期:
describe('createBoth', () => { it('should execute two write operations with correct params', async () => { // 替换为你实际的模拟入参 const mockInput = { name: 'test input' }; await service.createBoth(mockInput); // 验证第一次写入调用参数正确 expect(mockDataRepo.create).toHaveBeenCalledTimes(1); expect(mockDataRepo.create).toHaveBeenCalledWith(mockInput); // 验证第二次写入时传入了第一次返回的id expect(mockData2Repo.create2).toHaveBeenCalledTimes(1); expect(mockData2Repo.create2).toHaveBeenCalledWith(expect.objectContaining({ dataId: MOCK_GENERATED_DATA_ID, someInfo: 'test' })); }); }); });
注意事项
- 如果你实际写入用的是TypeORM的
save方法而非create,请将Mock的方法名替换为save,不要和实体实例化的create方法搞混 - 你贴出的业务代码存在笔误:
await this.data2Repository.create2(wallet);中的wallet应该是你定义的data2变量,实际运行前需要修正 - 如果实体有其他必填字段,在Mock返回值时可以一起补充,避免类型校验报错
内容的提问来源于stack exchange,提问作者new dev
相关产品推荐
相关产品推荐

