[英]NestJs - How to unit test a DTO?
我请你帮忙。 我创建了一个看起来像这样的 DTO(这是一个较小的版本):
export class OfImportDto {
@IsString({
message: "should be a valid product code"
})
productCode: string;
@IsString({
message: "Enter the proper product description"
})
productDescription: string;
@IsDateString({
message: "should be a valid date format, for example : 2017-06-07T14:34:08+04:00"
})
manufacturingDate : Date
@IsInt({
message: "should be a valid planned quantity number"
})
@IsPositive()
plannedQuantity: number;
问题是我要求用单元测试而不是 E2E 测试来测试它。 我不知道该怎么做。 例如,我想进行单元测试 1/ 如果我的产品代码是一个字符串,则应该创建一个字符串,如果不是,则抛出我的异常 2/ 如果我的产品描述是一个字符串,则应该创建一个字符串,如果不,抛出我的异常......等等。
那么,我可以制作一个 spec.ts 文件来测试吗? 如果是,如何? 如果没有,最好在 service.spec.ts 中测试它吗? 如果是这样,如何?
非常感谢,任何帮助都会非常有帮助:)
可以创建一个OfImportDTO.spec.ts
文件(或任何您调用的原始文件),但问题是,这里没有任何逻辑可以测试。 您可以做的最接近的事情是从class-validator
创建Validator
的实例,然后实例化OfImportDto
的实例,然后检查该类是否通过验证。 如果向其中添加逻辑(例如具有特定功能的 getter 和 setter),那么它对单元测试可能有意义,但除此之外,这基本上是一个被称为类的接口,因此它在运行时存在于class-validator
您应该为 DTO 的单元测试创建一个单独的 DTO 特定文件,例如of-import.dto.spec.ts
。 让我们一步一步地看看如何在 Nest.js 中测试 DTO。
要逐行理解,请继续阅读:
it('should throw when the planned quantity is a negative number.', async () => {
const importInfo = { productCode: 4567, plannedQuanity: -10 }
const ofImportDto = plainToInstance(OfImportDto, importInfo)
const errors = await validate(ofImportDto)
expect(errors.length).not.toBe(0)
expect(stringified(errors)).toContain(`Planned Quantity must be a positive number.`)
}
以下是您要测试以进行验证的对象:
const importInfo = { productCode: 4567, plannedQuanity: -10 }
如果你的测试对象有嵌套对象或者它太大,你可以跳过那些复杂的属性。 我们将看看如何处理。
使用class-transformer
包中的plainToinstace()
函数:
const ofImportDto = plainToInstance(OfImportDto, importInfo)
这会将您的普通测试对象转换为 DTO 类型的对象,即OfImportDto
。
使用class-validator
包中的validate()
函数:
const errors = await validate(ofImportDto)
如果您在创建测试对象时跳过了某些属性,您可以像下面这样处理:
const errors = await validate(ofImportDto, { skipMissingProperties: true })
现在验证将忽略缺少的属性。
断言errors
数组不为空并且它包含您的自定义错误消息:
expect(errors.length).not.toBe(0)
expect(stringified(errors)).toContain(`Planned Quantity must be a positive number.`)
这里的stringified()
是一个将errors
对象转换为 JSON 字符串的辅助函数,因此我们可以搜索它是否包含我们的自定义错误消息:
export function stringified(errors: ValidationError[]): string {
return JSON.stringify(errors)
}
而已! 希望有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.