如何在E2E测试中覆盖APP_GUARD

问题描述 投票:0回答:1

我正在为我的 NestJS 项目编写 E2E 测试,但遇到了一个无法解决的问题。

这是我的设置片段

const moduleFixture: TestingModule = await Test.createTestingModule({
  imports: [AppModule], // AppModule imports AuthModule
})
  .overrideProvider(APP_GUARD) // Not working
  .useClass(MockedAuthGuard)
  .compile();

app = moduleFixture.createNestApplication<NestExpressApplication>();

目标是在我的测试中使用

MockedAuthGuard
而不是真正的
AuthGuard

问题是没有效果。它仍然是真实的课程,而不是我的模拟版本。

我尝试的是像这样修改我的模块

@Module({
  imports: [],
  providers: [
    {
      provide: APP_GUARD,
      useClass: Env.isE2E ? MockedAuthGuard : AuthGuard,
    },
  ],
})
export class AuthModule {}

现在可以了,但我不喜欢这部分

Env.isE2E ? MockedAuthGuard : AuthGuard
。我想保持它干净并且只在 E2E 测试中覆盖它。

我在这里缺少什么?我怎样才能使用

overrideProvider
方法让它工作?

typescript nestjs e2e-testing
1个回答
0
投票

您可以直接将

useClass
添加到
APP_GUARD
数组,然后将
AuthGuard
用于
providers
提供程序,而不是将
useExisting: AuthGuard
APP_GUARD
提供程序一起使用。然后,在您的测试中,您可以正确使用
overrideProvider(AuthGuard).useClass(MockedAuthGuard)
,不会出现任何问题,使您的模块保持干净,并且您的测试是唯一引用模拟的模块。

@Module({
  imports: [],
  providers: [
    AuthGuard,
    {
      provide: APP_GUARD,
      useExisting: AuthGuard,
    },
  ],
})
export class AuthModule {}
© www.soinside.com 2019 - 2024. All rights reserved.