我正在为我的 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
方法让它工作?
您可以直接将
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 {}