NestJS测试模块中OverrideProvider无法覆盖PrivilegesGuard问题
NestJS测试模块中无法覆盖PrivilegesGuard提供者的问题
我正尝试在NestJS测试模块中覆盖PrivilegesGuard提供者,但未达到预期效果。已遵循overrideProvider方法的正确语法,但覆盖并未生效。
初始测试代码片段
beforeAll(async () => { const moduleRef = await Test.createTestingModule({ imports: [AppModule], providers: [ExceptionsService, JwtService, EnvironmentConfigService], }) .overrideProvider(PrivilegesGuard) .useClass(MockGuard) .compile(); app = moduleRef.createNestApplication(); await app.init(); });
已确认PrivilegesGuard提供者已正确导入,无冲突的导入或声明,且提供给useClass的MockGuard类已正确实现所需方法。但PrivilegesGuard提供者未被覆盖,仍在使用原始实现。查阅了文档和示例,但未找到解决方案。希望能理解为何overrideProvider方法在此场景下无法作用于PrivilegesGuard提供者,任何建议或见解都将不胜感激。
PrivilegesGuard实现代码
@Injectable() class PrivilegesGuard implements CanActivate { constructor(private readonly reflector: Reflector) {} async canActivate(context: ExecutionContext): Promise<boolean> { const contextPrivileges: PrivilegesMetadata = this.reflector.getAllAndOverride<PrivilegesMetadata>(PRIVILEGES_KEY, [ context.getHandler(), context.getClass(), ]); if (!contextPrivileges) { return true; } const user: ActiveUserData = getUserFromContext(context); if (!user.role || !user.role.privileges || user.role.privileges.length === 0) { return false; } const requiredEntities = user.role.privileges.filter( (priv) => priv.entity === contextPrivileges.intentionEntityKey, ); if (requiredEntities.length === 0) { return false; } const hasPrivilege = contextPrivileges.privileges.every((priv) => requiredEntities.some((req) => req.privilege === priv), ); return hasPrivilege; } } export default PrivilegesGuard;
Mock Guard代码
class MockGuard { async canActivate(context: ExecutionContext): Promise<boolean> { return true; } }
错误情况
测试中PrivilegesGuard未被替换,仍执行原始权限校验逻辑,导致测试失败。
尝试过的Workaround代码
beforeAll(async () => { const moduleRef = await Test.createTestingModule({ imports: [AppModule], providers: [ ExceptionsService, JwtService, EnvironmentConfigService, { provide: APP_GUARD, useExisting: PrivilegesGuard, }, { provide: APP_GUARD, useExisting: RolesGuard, }, RolesGuard, PrivilegesGuard, ], }) .overrideProvider(PrivilegesGuard) .useClass(MockGuard) .overrideProvider(RolesGuard) .useClass(MockGuard) .overrideProvider(AccessTokenGuard) .useClass(MockGuard) .overrideProvider(PostServiceImplementation) .useValue(mockPostService) .compile(); app = moduleRef.createNestApplication(); await app.init(); });
内容的提问来源于stack exchange,提问作者dan velescu
相关产品推荐
相关产品推荐

