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

如何在Jest中使用toMatchObject()校验ISO日期格式?

验证ISO时间戳字段的正确方法

为什么expect.any($type)无效

expect.any()只接受构造函数作为参数,用来校验值是否为该构造函数的实例:

  • expect.any(Date)会检查值是否为Date对象实例,但ISO时间戳通常是字符串格式,不适用;
  • ISO_8601、timestamp不是JS内置的构造函数,自然无法被识别。

方法一:用正则直接匹配格式

ISO 8601时间戳(UTC格式)有标准的正则表达式,直接用expect.stringMatching()校验即可:

// 匹配YYYY-MM-DDTHH:mm:ss.sssZ格式,支持可选毫秒
expect(yourObj.timestampField).toEqual(expect.stringMatching(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/));

方法二:自定义匹配器(更严谨)

如果需要同时校验格式合法性和可解析性,可以自定义Jest匹配器,方便复用:

// 扩展Jest匹配器
expect.extend({
  toBeISOTimestamp(received) {
    // 先校验字符串格式
    const isoRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/;
    if (typeof received !== 'string' || !isoRegex.test(received)) {
      return {
        message: () => `期望 ${received} 是合法的ISO 8601时间戳字符串`,
        pass: false,
      };
    }
    // 额外校验是否能解析为有效日期
    const date = new Date(received);
    if (date.toString() === 'Invalid Date') {
      return {
        message: () => `期望 ${received} 是可解析的ISO时间戳`,
        pass: false,
      };
    }
    return {
      message: () => `期望 ${received} 不是合法的ISO 8601时间戳字符串`,
      pass: true,
    };
  },
});

// 使用自定义匹配器
expect(yourObj.timestampField).toBeISOTimestamp();

内容的提问来源于stack exchange,提问作者user19546115

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:57:16