如何用Jest验证class-validator抛出的Validation Error数组?
用Jest断言class-validator抛出的验证错误数组
异步方法的错误断言思路
因为transformAndValidate是异步方法,测试时要结合async/await和Jest的rejectsAPI来捕获抛出的错误数组。
方式1:模糊匹配验证错误(推荐)
如果只需要确认数组中包含指定字段的验证错误,用expect.arrayContaining和expect.objectContaining组合即可:
test('缺少必填的RetailerOrderId时抛出验证错误', async () => { // 构造缺少必填字段的测试对象 const invalidOrder = { /* 其他合法字段,唯独缺RetailerOrderId */ }; await expect(OrderMapper.transformAndValidate(invalidOrder)).rejects.toEqual( expect.arrayContaining([ expect.objectContaining({ property: 'RetailerOrderId', // 命中要验证的字段 constraints: expect.objectContaining({ isNotEmpty: expect.any(String) // 匹配必填校验的错误信息(不管具体文本) }) }) ]) ); });
方式2:精确匹配完整错误结构
如果需要严格验证错误的所有细节,可以直接定义预期的错误数组进行全等匹配:
test('缺少必填字段时抛出完全符合预期的验证错误', async () => { const invalidOrder = { /* 测试对象 */ }; const expectedValidationErrors = [ { property: 'RetailerOrderId', constraints: { isNotEmpty: 'RetailerOrderId should not be empty' // 对应class-validator的错误提示文本 }, value: undefined, // 如果字段未传入,value会是undefined target: invalidOrder } ]; await expect(OrderMapper.transformAndValidate(invalidOrder)).rejects.toEqual(expectedValidationErrors); });
特殊情况处理
如果你的transformAndValidate把验证错误包装在了自定义错误类里(比如CustomValidationError),需要先匹配自定义错误的结构,再断言内部的错误列表:
test('验证失败时抛出带验证列表的自定义错误', async () => { const invalidOrder = { /* 测试对象 */ }; await expect(OrderMapper.transformAndValidate(invalidOrder)).rejects.toMatchObject({ message: '数据验证失败', errors: expect.arrayContaining([ expect.objectContaining({ property: 'RetailerOrderId' }) ]) }); });
内容的提问来源于stack exchange,提问作者SpaceCowboy74
相关产品推荐
相关产品推荐

