如何在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
相关产品推荐
相关产品推荐

