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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:22:12