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
相关产品推荐
相关产品推荐

