如何在NestJS上使用多个保护装置测试控制器

时间:2020-01-10 19:54:11

标签: nestjs

我正在测试控制器,但是在模拟该控制器的防护装置时遇到问题。我的应用是使用NestJs 6.13.1版开发的

我可以重写一个警卫来模拟它,如下所示:

const fakeGuard: CanActivate = { canActivate: () => true };

beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
        imports: [
            CoreModule,
            AuthModule,
            PermissionsModule,
            UsersModule
        ],
        controllers: [UsersController],
    })
    .overrideGuard(AuthGuard('jwt')).useValue(fakeGuard) // When I have one guard in my controller it works right
    .compile();

    controller = module.get<UsersController>(UsersController);
    app = module.createNestApplication();
    app.init();
});

但是在我的情况下,我在控制器中定义了2个警卫

@UseGuards(AuthGuard('jwt'), PermissionGuard)
export class UsersController {
    ...
}

我没有找到一种模拟一个以上后卫的方法。当我调用overrideGuard时,我尝试通过2个后卫,但是运行该测试时,没有任何异常。但我知道,问题是因为我无法嘲笑这两个后卫。如果您遇到相同的问题,请与我分享您的解决方案,谢谢。

1 个答案:

答案 0 :(得分:2)

您需要使用自己的overrideGuard指定要覆盖的每个防护。您可以拥有一个beforeEach,如下所示:

beforeEach(async () => {
  const moduleFixture: TestingModule = await Test.createTestingModule({
    imports: [AppModule],
  })
    .overrideGuard(Guard1)
    .useValue({ canActivate: () => true })
    .overrideGuard(Guard2)
    .useValue({ canActivate: () => true })
    .compile();

  app = moduleFixture.createNestApplication();
  await app.init();
});

现在两个守卫都将返回true,并且可以成功击中测试路线