Jest快照测试:日期字符串字段匹配expect.any/anything失败原因
Jest快照测试日期字符串不通过的原因及解决方法
核心原因分析
expect.any(Date)匹配错误
你的startDate字段实际是字符串类型(比如"2023-12-18T23:23:16.731-07:00"),但expect.any(Date)只匹配Date类的实例对象,类型完全不匹配,所以测试直接失败。expect.anything()测试失败是因为未更新快照
当你在toMatchSnapshot中使用不对称匹配器(比如expect.anything())时,旧快照里保存的是之前生成的具体日期字符串,Jest会拿这个固定值和匹配器的占位符对比,自然出现差异。这时候必须更新快照,让Jest把匹配器的规则记录到快照里,而不是固定的字符串。
解决步骤
1. 使用正确的匹配器
针对字符串类型的日期,用expect.any(String)匹配最基础的类型:
expect(reducer(initialModel, action)).toMatchSnapshot({ startDate: expect.any(String), });
如果需要更严格的格式校验(比如确保是ISO日期格式),可以用正则匹配:
expect(reducer(initialModel, action)).toMatchSnapshot({ startDate: expect.stringMatching(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[+-]\d{2}:\d{2}$/), });
2. 更新快照
运行Jest的快照更新命令,让新的匹配规则覆盖旧快照:
jest --updateSnapshot # 或者简写 jest -u
更新后,快照里的startDate会被替换成匹配器的占位符,后续测试只要字段符合匹配规则就会通过,不用再担心日期动态变化导致的失败。
内容的提问来源于stack exchange,提问作者jordan
相关产品推荐
相关产品推荐

