如何在 e2e 测试期间应用全局管道

col*_*r-j 6 nestjs

使用时如何应用全局管道Test.createTestingModule

通常,当应用程序安装在main.ts.

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

    app = moduleFixture.createNestApplication()
    await app.init()
    done()
  })
Run Code Online (Sandbox Code Playgroud)

Jar*_*rod 17

以下是我为确保main.ts文件中的全局管道始终与我的测试设置同步所做的操作...

首先创建一个名为 的新文件main.config.ts,其中应包含您的全局管道、过滤器等:

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

export function mainConfig(app: INestApplication) {
  app.enableCors();
  app.useGlobalPipes(new ValidationPipe());
}
Run Code Online (Sandbox Code Playgroud)

mainConfig接下来,在 和main.tsapp.e2e-spec.ts或在您设置测试的任何地方)中使用新创建的函数:

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();
Run Code Online (Sandbox Code Playgroud)

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();
});
Run Code Online (Sandbox Code Playgroud)

现在,如果您需要添加一个新管道,您只需在一个位置 ( main.config.ts) 进行更改即可看到它反映在应用程序和测试中。


col*_*r-j 6

您可以在初始化测试模块之前添加它们:

  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()
  })
Run Code Online (Sandbox Code Playgroud)

  • 应该有一种方法可以自动包含 main.ts 中的类似内容 (14认同)
  • @CoreyBerigan 查看我的答案:/sf/answers/5046326351/ ...它不会自动包含它,但它确保您的测试和 main.ts 保持同步。 (2认同)