You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:22:38