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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:18:00