如何在NestJS上测试具有多个防护的控制器

如何在NestJS上测试具有多个防护的控制器,nestjs,Nestjs,我正在测试我的控制器,但我有一个问题,以模拟该控制器的警卫。我的应用程序是用NestJs版本6.13.1开发的 我可以超越一个守卫来模拟它,正如下面的剪断: const fakeGuard: CanActivate = { canActivate: () => true }; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ impo

我正在测试我的控制器,但我有一个问题,以模拟该控制器的警卫。我的应用程序是用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();
});

我找不到办法嘲笑不止一个警卫。当我调用overrideGuard时,我尝试通过2个守卫,但是当我运行测试时,没有任何异常。但我知道,问题是我不能嘲笑那两个警卫。如果您遇到同样的问题,请与我分享您的解决方案,谢谢。

您需要指定要用自己的
覆盖守卫覆盖的每个守卫。您可以在每个
之前设置一个如下所示的

beforeach(异步()=>{
常量ModuleTexture:TestingModule=Wait Test.createTestingModule({
导入:[AppModule],
})
.超控守卫(守卫1)
.useValue({canActivate:()=>true})
.超控守卫(守卫2)
.useValue({canActivate:()=>true})
.compile();
app=moduleTexture.createNestApplication();
等待app.init();
});

现在,两个防护都将返回true,并且可以成功命中测试路由

您需要指定要用自己的
覆盖防护
覆盖的每个防护。您可以在每个
之前设置一个如下所示的

beforeach(异步()=>{
常量ModuleTexture:TestingModule=Wait Test.createTestingModule({
导入:[AppModule],
})
.超控守卫(守卫1)
.useValue({canActivate:()=>true})
.超控守卫(守卫2)
.useValue({canActivate:()=>true})
.compile();
app=moduleTexture.createNestApplication();
等待app.init();
});

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

Jay McDoniel感谢您的回答。我注意到真正的问题是嘲笑我的定制警卫。我的自定义guard接收两个参数,一个是反射器,一个是服务。也许这些参数导致了我不确定的问题。看看nestjs报告的内容:[Nest]11812-2020-01-10 17:12:30[ExceptionHandler]对象:{}Jay McDoniel谢谢你的回答。我注意到真正的问题是嘲笑我的定制警卫。我的自定义guard接收两个参数,一个是反射器,一个是服务。也许这些参数导致了我不确定的问题。看看nestjs报告的内容:[Nest]11812-2020-01-10 17:12:30[ExceptionHandler]对象:{}
@UseGuards(AuthGuard('jwt'), PermissionGuard)
export class UsersController {
    ...
}