如何在nestjs的e2e测试中配置中间件

Jef*_*han 5 testing middleware e2e-testing nestjs

在实际应用中,我们这样写:

export class AppModule implements NestModule {
  constructor() {}

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

在 e2e 测试中,我做这样的事情:

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

那么如何在 e2e 测试中指定中间件呢?

小智 10

也许尝试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,
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在 e2e 中:

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

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

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

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

const app = Test
  .createTestingModule({ imports: [AppModule] })
  .compile()
  .createNestApplication();
Run Code Online (Sandbox Code Playgroud)

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

app.enableCors();
app.use(json());
app.use(formDataMiddleware(config));
Run Code Online (Sandbox Code Playgroud)

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

await app.init();
Run Code Online (Sandbox Code Playgroud)