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

TypeOrm自定义仓库迁移至NestJs可注入提供者的测试问题

问题描述

已将TypeORM升级至0.3.12版本,@nestjs/typeorm升级至9.0.1版本,按参考方案完成所有自定义仓库迁移后,测试时将依赖添加至createTestingModule的providers元数据仍无法正常运行。怀疑dailyTaskRepository = module.get<TypeOrmDailyTaskRepository>(TypeOrmDailyTaskRepository)这行获取实例的代码已过时,但不清楚当前如何从模块中获取提供者实例。

环境版本

  • TypeORM: 0.3.12
  • @nestjs/typeorm: 9.0.1

测试代码

// daily-task.typeorm.inte.ts
import { TypeOrmModule } from '@nestjs/typeorm'
import { config } from '../../../config'
import { Test } from '@nestjs/testing'
import { TypeOrmDailyTaskRepository } from './daily-task.typeorm.repository'
import { dailyTaskDataBuilder } from '../data-builders/daily-task.data-builder'
import { DailyTask } from '../entities/daily-task.entity'
import { TypeOrmExerciseRepository } from '../../exercise/repositories/type-orm-exercise.repository'
import { TypeOrmAthleteRepository } from '../../athlete/repositories/typeorm-athlete.repository'
import { TypeOrmProgramRepository } from '../../program/repositories/type-orm-program.repository'
import { TypeOrmBiometricsRepository } from '../../biometrics/repositories/typeorm-biometrics.repository'
import { TypeOrmExerciseTemplateRepository } from '../../exercise/repositories/type-orm-exercise-template.repository'
import { TypeOrmWorkoutRepository } from '../../workout/repositories/workout.typeorm.repository'
import { TypeOrmSessionRepository } from '../../session/repositories/session.typeorm.repository'
import { TypeOrmPerformanceRepository } from '../../performance/repositories/performance.typeorm.repository'
import { BaseEntity } from '../../__infrastructure__/typeorm/base.entity'

const dailyTasksFixtures = [dailyTaskDataBuilder(), dailyTaskDataBuilder()]

async function generateDailyTasksFixtures(
  dailyTaskRepository: TypeOrmDailyTaskRepository,
) {
  await dailyTaskRepository.save(dailyTasksFixtures)
}

describe('TypeOrm DailyTask Repository', () => {
  let dailyTaskRepository: TypeOrmDailyTaskRepository

  beforeAll(async () => {
    const module = await Test.createTestingModule({
      imports: [TypeOrmModule.forRoot(config.db)],
      providers: [
        TypeOrmAthleteRepository,
        TypeOrmBiometricsRepository,
        TypeOrmDailyTaskRepository,
        TypeOrmExerciseRepository,
        TypeOrmExerciseTemplateRepository,
        TypeOrmProgramRepository,
        TypeOrmWorkoutRepository,
        TypeOrmSessionRepository,
        TypeOrmPerformanceRepository,
        DailyTask,
        BaseEntity,
      ],
    }).compile()

    dailyTaskRepository = module.get<TypeOrmDailyTaskRepository>(
      TypeOrmDailyTaskRepository,
    )

    await dailyTaskRepository.query('SET FOREIGN_KEY_CHECKS=0')
    await dailyTaskRepository.query(`DELETE FROM daily_task;`)
    await generateDailyTasksFixtures(dailyTaskRepository)
  })

  afterAll(async () => {
    await dailyTaskRepository.query('SET FOREIGN_KEY_CHECKS=0')
    await dailyTaskRepository.query(`DELETE FROM daily_task;`)
  })

  it('should be defined', () => {
    expect(dailyTaskRepository).toBeDefined()
  })

  it('should get all daily tasks', async () => {
    const expectedDailyTasks = [
      new DailyTask(dailyTasksFixtures[0]),
      new DailyTask(dailyTasksFixtures[1]),
    ]

    const retrievedDailyTasks = await dailyTaskRepository.getAll()

    expect(retrievedDailyTasks).toStrictEqual(expectedDailyTasks)
  })
})

控制台错误信息

yarn run v1.22.17
$ jest --testTimeout=10000 -c jest-inte.json --runInBand --forceExit src/daily-task/repositories/daily-task.typeorm.repository.inte.ts -t 'should be defined'
FAIL src/daily-task/repositories/daily-task.typeorm.repository.inte.ts (5.365 s)
  TypeOrm DailyTask Repository
    ✕ should be defined (2 ms)
    ○ skipped should get all daily tasks

  ● TypeOrm DailyTask Repository › should be defined

    Nest无法解析DailyTask的依赖(?)。请确保索引[0]处的参数Object在RootTestModule上下文中可用。

    可能的解决方案:
    - 如果Object是提供者,它是否属于当前RootTestModule?
    - 如果Object是从独立@Module导出的,该模块是否已在RootTestModule中导入?
      @Module({
        imports: [ /* 包含Object的模块 */ ]
      })

      at Injector.lookupComponentInParentModules (node_modules/@nestjs/core/injector/injector.js:188:19)
      at Injector.resolveComponentInstance (node_modules/@nestjs/core/injector/injector.js:144:33)
      at resolveParam (node_modules/@nestjs/core/injector/injector.js:98:38)
          at async Promise.all (index 0)
      at Injector.resolveConstructorParams (node_modules/@nestjs/core/injector/injector.js:113:27)
      at Injector.loadInstance (node_modules/@nestjs/core/injector/injector.js:46:9)
      at Injector.loadProvider (node_modules/@nestjs/core/injector/injector.js:68:9)
          at async Promise.all (index 12)
      at InstanceLoader.createInstancesOfProviders (node_modules/@nestjs/core/injector/instance-loader.js:43:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:28:13

  ● TypeOrm DailyTask Repository › should be defined

    expect(received).toBeDefined()

    接收值:undefined

      59 |
      60 |   it('should be defined', () => {
    > 61 |     expect(dailyTaskRepository).toBeDefined()
         |                                 ^
      62 |   })
      63 |
      64 |   it('should get all daily tasks', async () => {

      at Object.<anonymous> (src/daily-task/repositories/daily-task.typeorm.repository.inte.ts:61:33)

  ● TypeOrm DailyTask Repository › should get all daily tasks

    Nest无法解析DailyTask的依赖(?)。请确保索引[0]处的参数Object在RootTestModule上下文中可用。

    可能的解决方案:
    - 如果Object是提供者,它是否属于当前RootTestModule?
    - 如果Object是从独立@Module导出的,该模块是否已在RootTestModule中导入?
      @Module({
        imports: [ /* 包含Object的模块 */ ]
      })

      at Injector.lookupComponentInParentModules (node_modules/@nestjs/core/injector/injector.js:188:19)
      at Injector.resolveComponentInstance (node_modules/@nestjs/core/injector/injector.js:144:33)
      at resolveParam (node_modules/@nestjs/core/injector/injector.js:98:38)
          at async Promise.all (index 0)
      at Injector.resolveConstructorParams (node_modules/@nestjs/core/injector/injector.js:113:27)
      at Injector.loadInstance (node_modules/@nestjs/core/injector/injector.js:46:9)
      at Injector.loadProvider (node_modules/@nestjs/core/injector/injector.js:68:9)
          at async Promise.all (index 12)
      at InstanceLoader.createInstancesOfProviders (node_modules/@nestjs/core/injector/instance-loader.js:43:9)
      at node_modules/@nestjs/core/injector/instance-loader.js:28:13

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 skipped, 2 total
Snapshots:   0 total
Time:        5.42 s, estimated 9 s
Ran all test suites matching /src\/daily-task\/repositories\/daily-task.typeorm.repository.inte.ts/i with tests matching "should be defined".
Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished?
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
➜  back git:(migrate/typeorm) ✗

内容的提问来源于stack exchange,提问作者A Mehmeto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:30:51