【发布时间】:2020-03-09 14:25:02
【问题描述】:
TLNR:我试图在控制器规范中测试 DTO 验证,而不是在 e2e 规范中进行测试,而 e2e 规范正是为此而设计的。 McDoniel 的回答为我指明了正确的方向。
我开发了一个 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 的 aaaall 对象,这将是非常低效的。此外,实例化类意味着如果我自愿省略一些必需的属性或指示不正确的值,TypeScript 将引发错误。
所以问题是:
如何在我的测试中使用 NestJs 内置的请求正文解析器,以便我可以为 dto 编写任何我想要的 JSON,将其解析为 作为 MyDto 对象并使用 class-validator 验证它验证函数?
也欢迎任何替代的更好的实践方法来测试验证!
【问题讨论】:
标签: validation testing dto nestjs