如何使用NestJS和class-validator手动测试输入验证

问题描述 投票:0回答:1

TLNR:我试图在控制器规范中而不是在e2e规范中测试DTO验证,而e2e规范正是为此而设计的。麦克道尼尔的回答为我指明了正确的方向。


我开发了一个NestJS入口点,看起来像这样:

@Post()
async doStuff(@Body() dto: MyDto): Promise<string> {
  // some code...
}

我使用class-validator,以便当我的API收到请求时,将有效负载解析并转换为MyDto对象,并执行作为MyDto类中的批注显示的验证。请注意,MyDto具有MySubDto类的嵌套对象数组。使用@ValidateNested和@Type批注,嵌套对象也可以正确验证。

这很好。

现在,我要为执行的验证编写测试。在我的.spec文件中,我写:

import { validate  } from 'class-validator';
// ...
it('should FAIL on invalid DTO', async () => {
  const dto = {
    //...
  };
  const errors = await validate( dto );
  expect(errors.length).not.toBe(0);
}

这会失败,因为经过验证的dto对象不是MyDto。我可以这样重写测试:

it('should FAIL on invalid DTO', async () => {
  const dto = new MyDto()
  dto.attribute1 = 1;
  dto.subDto = { 'name':'Vincent' };
  const errors = await validate( dto );
  expect(errors.length).not.toBe(0);
}

现在可以在MyDto对象上正确进行验证,但不能在我的嵌套subDto对象上进行验证,这意味着我将必须使用根据类实例化Dto的所有对象,这将大大降低效率。另外,实例化类意味着如果我自愿省略某些必需的属性或指示错误的值,TypeScript将引发错误。

所以问题是:

如何在测试中使用NestJs内置的请求主体解析器,以便可以编写想要用于dto的任何JSON,将其解析为[[as MyDto对象并使用class-validator validate函数进行验证?] >也欢迎使用其他任何更好的实践方法来进行验证!

TLNR:我试图在控制器规范中而不是在e2e规范中测试DTO验证,这正是为此而设计的。麦道尼尔的回答为我指明了正确的方向。我开发了一个NestJS ...

validation testing dto nestjs
1个回答
1
投票
要使用验证管道测试输入验证,我认为最好的方法是在e2e测试中而不是在单元测试中,只需确保记住注册管道即可(如果您通常使用[C0 ]而不是使用依赖注入)
© www.soinside.com 2019 - 2024. All rights reserved.