NestJS e2e测试报错:无法解析UsersService的JwtService依赖
NestJS E2E测试依赖解析错误排查与解决
问题概述
编写NestJS登录接口的E2E测试时,出现依赖解析错误,无法解析UsersService的JwtService依赖。
报错信息
Nest can't resolve dependencies of the UsersService (UsersModel, ?). Please make sure that the argument JwtService at index [1] is available in the UsersModule context.
问题根源
- 测试代码使用未初始化变量:测试中
overrideProvider(UsersService).useValue(usersService)的usersService仅声明未赋值,传入undefined导致Nest无法构建合法服务实例。 - UsersModule缺失JwtModule导入:
UsersService依赖JwtService,但UsersModule未导入并配置JwtModule,导致Nest在任何上下文(包括测试)中无法解析该依赖。
解决方案
方案1:补全UsersModule的JwtModule配置
检查并修改UsersModule,确保已导入并配置JwtModule,示例代码如下:
import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { JwtModule } from '@nestjs/jwt'; import { UsersService } from './users.service'; import { UsersController } from './users.controller'; import { Users, UserSchema } from 'src/schemas/user.schema'; @Module({ imports: [ MongooseModule.forFeature([{ name: Users.name, schema: UserSchema }]), // 配置JwtModule,密钥建议从环境变量读取 JwtModule.register({ secret: process.env.JWT_SECRET || 'your-default-secret', signOptions: { expiresIn: '1h' }, }), ], controllers: [UsersController], providers: [UsersService], }) export class UsersModule {}
方案2:修正测试中的服务Mock逻辑
若需要MockUsersService,需先创建合法的Mock对象再传入,修改测试的beforeEach部分:
beforeEach(async () => { // 创建UsersService的Mock实现,覆盖测试用到的方法 const mockUsersService = { createUser: jest.fn().mockResolvedValue(true), }; const moduleRef = await Test.createTestingModule({ imports: [UsersModule], }) .overrideProvider(UsersService) .useValue(mockUsersService) .compile(); app = moduleRef.createNestApplication(); await app.init(); });
方案3:单独Mock JwtService避免真实依赖
若要使用真实UsersService但不想依赖真实JWT服务,可单独MockJwtService:
beforeEach(async () => { const mockJwtService = { sign: jest.fn().mockReturnValue('mock-jwt-token'), }; const moduleRef = await Test.createTestingModule({ imports: [UsersModule], }) .overrideProvider(JwtService) .useValue(mockJwtService) .compile(); app = moduleRef.createNestApplication(); await app.init(); });
内容的提问来源于stack exchange,提问作者Mustafa UYSAL
相关产品推荐
相关产品推荐

