我正在测试控制器,但是在模拟该控制器的防护装置时遇到问题。我的应用是使用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个后卫,但是运行该测试时,没有任何异常。但我知道,问题是因为我无法嘲笑这两个后卫。如果您遇到相同的问题,请与我分享您的解决方案,谢谢。
答案 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,并且可以成功击中测试路线