網站搜尋

javascript - 如何在 e2e 測試中應用全局管道


在使用 Test.createTestingModule 時,如何套用全局管道?

通常,當應用程式在 main.ts 中掛載時,會添加全局管道。

beforeEach(async done => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule]
    }).compile()

    app = moduleFixture.createNestApplication()
    await app.init()
    done()
  })

答案#1

這是我為了確保我的 main.ts 文件中的全域管道始終與我的測試設置同步所做的事情...

首先建立一個名為 main.config.ts 的新檔案,這裡應該包含你的全域管道、過濾器等:

import { INestApplication, ValidationPipe } from "@nestjs/common";

export function mainConfig(app: INestApplication) {
  app.enableCors();
  app.useGlobalPipes(new ValidationPipe());
}

接下來,在 main.ts 和 app.e2e-spec.ts(或你設定測試的任何位置)中使用新建立的 mainConfig 函數:

main.ts
import { NestFactory } from "@nestjs/core";
import { mainConfig } from "main.config";
import { AppModule } from "./app.module";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // use here
  mainConfig(app);

  await app.listen(3000);
}

bootstrap();
app.e2e-spec.ts
import { INestApplication } from "@nestjs/common";
import { TestingModule, Test } from "@nestjs/testing";
import { AppModule } from "app.module";
import { mainConfig } from "main.config";

let app: INestApplication;

beforeEach(async () => {
  const moduleFixture: TestingModule = await Test.createTestingModule({
    imports: [AppModule],
  }).compile();

  app = moduleFixture.createNestApplication();

  // use here
  mainConfig(app);

  await app.init();
});

現在如果你需要新增一個管道,你只需要在一個地方(main.config.ts)進行更改,就能在應用程式和測試中看到相應的變化。

答案#2

你可以在初始化測試模組之前添加它們:

  beforeEach(async done => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule]
    }).compile()

    app = moduleFixture.createNestApplication()

    // Add global pipe here
    app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true, forbidNonWhitelisted: true }))

    await app.init()
    done()
  })