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

Nest.js TestingModule注入异常:无法获取PrismaService等@Injectable类

Nest.js测试模块无法获取自定义@Injectable服务的问题

问题现象

应用正常运行,但测试环节使用TestingModule导入AppModule后,能成功获取UserRepositoryProvider,但获取PrismaService等自定义@Injectable类时,抛出错误:

Nest could not find PrismaService element (this provider does not exist in the current context)

所有自定义@Injectable类均存在此问题。

相关代码

test/user.integration.spec.ts

describe("User Controller", () => {
  let app: INestApplication;

  let userRepository: UserRepository;

  beforeEach(async () => {
    const moduleRef: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    userRepository = moduleRef.get("UserRepository"); // 正常工作
    const prisma = moduleRef.get(PrismaService); // 报错
    console.log(prisma);
    app = moduleRef.createNestApplication();
    await app.init();
  });

  afterAll(async () => {
    await app.close();
  });
});

src/app-module.ts

const controllers = [HealthCheckController, UserController];
const providers = [UserRepositoryProvider];
const services = [PrismaService];
const useCases = [RegisterUserUseCase, GetUserInfosUseCase];

@Module({
  imports: [],
  controllers: controllers,
  providers: [...providers, ...services, ...useCases],
  exports: [...providers, ...services, ...useCases],
})
export class AppModule {}

src/infrastructure/persistence/prisma.service.ts

import { Injectable, OnModuleInit, OnModuleDestroy } from "@nestjs/common";
import { PrismaClient } from "@prisma/client";

@Injectable()
export class PrismaService
  extends PrismaClient
  implements OnModuleInit, OnModuleDestroy
{
  constructor() {
    super({
      datasources: {
        db: {
          url:
            process.env.NODE_ENV === "production"
              ? process.env.DATABASE_URL
              : process.env.DATABASE_URL_DEV,
        },
      },
    });
  }

  async onModuleInit() {
    let retries = 5;
    while (retries > 0) {
      try {
        await this.$connect();
        console.log("Database connection established.");
        break;
      } catch (error) {
        retries--;
        console.log(`Retrying database connection (${5 - retries}/5)...`);
        if (retries === 0) {
          throw error;
        }
        await new Promise((res) => setTimeout(res, 5000)); // 重试前等待5秒
      }
    }
  }

  async onModuleDestroy() {
    await this.$disconnect();
  }
}

解决方案

1. 确保测试文件正确导入目标服务类

检查test/user.integration.spec.ts中是否正确导入PrismaService,缺少导入会导致TypeScript无法识别类引用,Nest DI系统无法匹配对应提供者:

import { PrismaService } from '../src/infrastructure/persistence/prisma.service';

2. 先初始化应用实例再获取服务

调整代码顺序,先完成应用初始化再获取服务。app.init()会触发模块生命周期钩子,确保所有提供者完成实例化:

beforeEach(async () => {
  const moduleRef: TestingModule = await Test.createTestingModule({
    imports: [AppModule],
  }).compile();

  app = moduleRef.createNestApplication();
  await app.init();

  userRepository = moduleRef.get("UserRepository");
  const prisma = moduleRef.get(PrismaService); // 或使用app.get(PrismaService)
  console.log(prisma);
});

3. 确认提供者导出配置

确保AppModule的exports数组包含PrismaService(你的代码已满足此要求),保证测试模块能访问到该服务。

验证方法

  • 补全服务类的导入后重新运行测试
  • 调整初始化顺序,观察错误是否消失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:20:23