如何测试验证管道在 NestJS 上抛出错误形状的请求的期望错误

zma*_*anc 1 jestjs nestjs

我正在使用 NestJS 7.0.2 并通过app.useGlobalPipes(new ValidationPipe());.

我希望能够进行单元测试,以验证是否在提供形状不正确的对象时抛出错误,但是编写的测试仍然通过。我已经看到一种解决方案是通过这篇文章在 e2e 中进行此测试,但我想知道是否有任何我遗漏的内容可以让我在单元测试中执行此操作。

我有一个非常简单的控制器和一个非常简单的 DTO。

控制器

async myApi(@Body() myInput: myDto): Promise<myDto | any> {
  return {};
}
Run Code Online (Sandbox Code Playgroud)

DTO

export class myDto {
  @IsNotEmpty()
  a: string;

  @IsNotEmpty()
  b: string | Array<string>
}
Run Code Online (Sandbox Code Playgroud)

规范文件

  describe('generate', () => {
    it('should require the proper type', async () => {
      const result = await controller.generate(<myDto>{});
      // TODO: I expect a validation error to occur here so I can test against it.
      expect(result).toEqual({})
    })
  })
Run Code Online (Sandbox Code Playgroud)

如果我不强制类型myDto并且只是ts-ignore对通用对象执行 a ,它也会失败。

小智 5

只需使用 ValidationPipe 测试您的 DTO:

it('validate DTO', async() => {
    let target: ValidationPipe = new ValidationPipe({ transform: true, whitelist: true });
    const metadata: ArgumentMetadata = {
        type: 'body',
        metatype: myDto,
        data: ''
    };
    await target.transform(<myDto>{}, metadata)
        .catch(err => {
            expect(err.getResponse().message).toEqual(["your validation error"])
        })
});
Run Code Online (Sandbox Code Playgroud)

你可以找到这里的Nestjs代码库的ValidationPipe完整的测试实例