首页 > 解决方案 > 如何在nestjs的e2e测试中配置中间件

问题描述

在实际应用中,我们编写:

export class AppModule implements NestModule {
  constructor() {}

  configure(consumer: MiddlewareConsumer) {
    consumer.apply(JwtExtractionMiddleware).forRoutes({
      path: 'graphql',
      method: RequestMethod.ALL,
    });
  }
}

在 e2e 测试中,我执行以下操作:

const module = await Test.createTestingModule({
  imports: [ GraphQLModule.forRoot(e2eGqlConfig) ],
  providers: [ PubUserResolver ],
}).compile();
app = await module.createNestApplication().init();

那么如何在 e2e 测试中使用特定的中间件呢?

标签: testingmiddlewaree2e-testingnestjs

解决方案


也许尝试TestModule仅为 e2e 创建一个特定的类并将其提供给createTestingModule

@Module({
  imports: [ GraphQLModule.forRoot(e2eGqlConfig) ],
  providers: [ PubUserResolver ],
})
export class TestModule implements NestModule {
  constructor() {}

  configure(consumer: MiddlewareConsumer) {
    consumer.apply(JwtExtractionMiddleware).forRoutes({
      path: 'graphql',
      method: RequestMethod.ALL,
    });
  }
}

然后在 e2e 中:

const module = await Test.createTestingModule({
  imports: [TestModule]
}).compile();
app = await module.createNestApplication().init();

我有类似的问题,我需要附加全局中间件。互联网上也没有关于此的信息,但偶然我找到了解决方案。也许有人会寻找它,所以这里是:

要在 NestJS 的 e2e 中使用全局中间件:

首先创建应用程序,但不要初始化它。只编译:

const app = Test
  .createTestingModule({ imports: [AppModule] })
  .compile()
  .createNestApplication();

之后,您可以添加所有全局中间件:

app.enableCors();
app.use(json());
app.use(formDataMiddleware(config));

现在初始化应用程序,就是这样:

await app.init();

推荐阅读