我将 NestJS 与添加到车辆控制器的 RolesGuard 一起使用,但是当我对车辆控制器进行单元测试时,我遇到了关于 jwt 策略的依赖性错误
I use NestJS with RolesGuard added to a vehicle controller, however I get a dependency error on jwt strategy when I unit test the vehicle controller
JwtStrategy
import { Injectable, Logger, UnauthorizedException } from '@nestjs/common'
import { PassportStrategy } from '@nestjs/passport'
import { ConfigService } from '@nestjs/config'
import { Request } from 'express'
import { ExtractJwt, Strategy } from 'passport-jwt'
import { AuthService } from '../auth.service'
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
private readonly logger = new Logger(JwtStrategy.name)
constructor(private authService: AuthService, private readonly configService: ConfigService) {
super({
ignoreExpiration: false,
secretOrKey: configService.get('JWT_SECRET'),
jwtFromRequest: ExtractJwt.fromExtractors([
(request: Request) => {
const data = request?.cookies['authCookie']
if (!data) {
return null
}
return data.accessToken
},
]),
})
this.logger
}
async validate(payload: any) {
// the validation code
}
AuthModule
import { Module } from '@nestjs/common'
import { MongooseModule } from '@nestjs/mongoose'
import { JwtModule } from '@nestjs/jwt'
import { PassportModule } from '@nestjs/passport'
import { ConfigModule, ConfigService } from '@nestjs/config'
import { JwtStrategy } from './strategies/jwt.strategy'
import { LocalStrategy } from './strategies/local.strategy'
import { RefreshStrategy } from './strategies/refresh.strategy'
import { User, UserSchema } from './schemas/user.schema'
import { AuthController } from './auth.controller'
import { AuthService } from './auth.service'
import { RolesGuard } from './guards/roles.guard'
@Module({
imports: [
MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
PassportModule.register({
session: false,
}),
JwtModule.registerAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
secret: configService.get('JWT_SECRET'),
signOptions: {
expiresIn:
configService.get('NODE_ENV') === 'development'
? configService.get('JWT_MAX_EXPIRATION_DAYS')
: configService.get('JWT_EXPIRES_IN'),
},
}),
inject: [ConfigService],
}),
],
providers: [AuthService, LocalStrategy, JwtStrategy, RefreshStrategy, RolesGuard],
controllers: [AuthController],
exports: [AuthService],
})
export class AuthModule {}
车辆模块
import { Module } from '@nestjs/common'
import { VehicleService } from './vehicle.service'
import { VehicleController } from './vehicle.controller'
import { Vehicle} from './schemas/vehicle.schema'
import { MongooseModule } from '@nestjs/mongoose'
import { AuthModule } from '../auth/auth.module'
@Module({
imports: [
AuthModule,
MongooseModule.forFeature([{ name: Vehicle.name, schema: VehicleSchema }]),
],
controllers: [VehicleController],
providers: [VehicleService],
})
export class VehicleModule {}
VehicleController 测试文件
describe('Vehicle Controller:', () => {
let controller: VehicleController
let service: VehicleService
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [AuthModule],
controllers: [VehicleController],
providers: [VehicleService],
}).compile()
controller = module.get<VehicleController>(VehicleController)
service = module.get<VehicleService>(VehicleService)
jest.clearAllMocks()
})
当我运行车辆控制器的单元测试代码
时,我一直收到这个错误
Nest 无法解析 JwtStrategy(AuthService,?)的依赖项。请确保索引 [1] 处的参数 ConfigService 在 AuthModule 上下文中可用。
潜在的解决方案:
- 如果 ConfigService 是一个提供者,它是当前 AuthModule 的一部分吗?
- 如果 ConfigService 是从单独的 @Module 导出的,那么该模块是否导入到 AuthModule 中?
@模块({
导入:[ / 包含 ConfigService 的模块 / ]
})
我知道这与依赖有关,但我想不出解决办法。
非常感谢任何 help/suggestion 可能的原因。
更新:
在 AuthModule 中添加这个:
@Module({
imports: [
ConfigModule.forRoot({
load: [configuration],
isGlobal: true,
}),
...
returns 这个错误:
Nest 无法解析 UserModel (?) 的依赖项。请确保索引 [0] 处的参数 DatabaseConnection 在 MongooseModule 上下文中可用。
可能的解决方案:...
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [],
controllers: [VehicleController],
providers: [
VehicleService,
{
provide: AuthService,
useValue: {
get: jest.fn(() => MockedAuthService),
},
},
],
}).compile()
JwtStrategy
import { Injectable, Logger, UnauthorizedException } from '@nestjs/common'
import { PassportStrategy } from '@nestjs/passport'
import { ConfigService } from '@nestjs/config'
import { Request } from 'express'
import { ExtractJwt, Strategy } from 'passport-jwt'
import { AuthService } from '../auth.service'
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') {
private readonly logger = new Logger(JwtStrategy.name)
constructor(private authService: AuthService, private readonly configService: ConfigService) {
super({
ignoreExpiration: false,
secretOrKey: configService.get('JWT_SECRET'),
jwtFromRequest: ExtractJwt.fromExtractors([
(request: Request) => {
const data = request?.cookies['authCookie']
if (!data) {
return null
}
return data.accessToken
},
]),
})
this.logger
}
async validate(payload: any) {
// the validation code
}
AuthModule
import { Module } from '@nestjs/common'
import { MongooseModule } from '@nestjs/mongoose'
import { JwtModule } from '@nestjs/jwt'
import { PassportModule } from '@nestjs/passport'
import { ConfigModule, ConfigService } from '@nestjs/config'
import { JwtStrategy } from './strategies/jwt.strategy'
import { LocalStrategy } from './strategies/local.strategy'
import { RefreshStrategy } from './strategies/refresh.strategy'
import { User, UserSchema } from './schemas/user.schema'
import { AuthController } from './auth.controller'
import { AuthService } from './auth.service'
import { RolesGuard } from './guards/roles.guard'
@Module({
imports: [
MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
PassportModule.register({
session: false,
}),
JwtModule.registerAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
secret: configService.get('JWT_SECRET'),
signOptions: {
expiresIn:
configService.get('NODE_ENV') === 'development'
? configService.get('JWT_MAX_EXPIRATION_DAYS')
: configService.get('JWT_EXPIRES_IN'),
},
}),
inject: [ConfigService],
}),
],
providers: [AuthService, LocalStrategy, JwtStrategy, RefreshStrategy, RolesGuard],
controllers: [AuthController],
exports: [AuthService],
})
export class AuthModule {}
车辆模块
import { Module } from '@nestjs/common'
import { VehicleService } from './vehicle.service'
import { VehicleController } from './vehicle.controller'
import { Vehicle} from './schemas/vehicle.schema'
import { MongooseModule } from '@nestjs/mongoose'
import { AuthModule } from '../auth/auth.module'
@Module({
imports: [
AuthModule,
MongooseModule.forFeature([{ name: Vehicle.name, schema: VehicleSchema }]),
],
controllers: [VehicleController],
providers: [VehicleService],
})
export class VehicleModule {}
VehicleController 测试文件
describe('Vehicle Controller:', () => {
let controller: VehicleController
let service: VehicleService
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [AuthModule],
controllers: [VehicleController],
providers: [VehicleService],
}).compile()
controller = module.get<VehicleController>(VehicleController)
service = module.get<VehicleService>(VehicleService)
jest.clearAllMocks()
})
当我运行车辆控制器的单元测试代码
时,我一直收到这个错误Nest 无法解析 JwtStrategy(AuthService,?)的依赖项。请确保索引 [1] 处的参数 ConfigService 在 AuthModule 上下文中可用。 潜在的解决方案: - 如果 ConfigService 是一个提供者,它是当前 AuthModule 的一部分吗? - 如果 ConfigService 是从单独的 @Module 导出的,那么该模块是否导入到 AuthModule 中? @模块({ 导入:[ / 包含 ConfigService 的模块 / ] })
我知道这与依赖有关,但我想不出解决办法。
非常感谢任何 help/suggestion 可能的原因。
更新: 在 AuthModule 中添加这个:
@Module({
imports: [
ConfigModule.forRoot({
load: [configuration],
isGlobal: true,
}),
...
returns 这个错误:
Nest 无法解析 UserModel (?) 的依赖项。请确保索引 [0] 处的参数 DatabaseConnection 在 MongooseModule 上下文中可用。 可能的解决方案:...
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [],
controllers: [VehicleController],
providers: [
VehicleService,
{
provide: AuthService,
useValue: {
get: jest.fn(() => MockedAuthService),
},
},
],
}).compile()