如何在expect.objectContaining中使用正则表达式进行测试
在对象匹配中验证ISO 8601格式属性的简洁方法
你可以用Jest内置的expect.stringMatching()匹配器,它专门支持在expect.objectContaining()这类嵌套断言场景中验证字符串格式,完美解决你遇到的问题。
具体实现步骤:
- 先定义ISO 8601格式的正则表达式(可根据需求调整精度,比如带毫秒或时区的版本):
const ISO_8601_PATTERN = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
- 直接在
expect.objectContaining()中使用expect.stringMatching()验证expire_at,同时指定其他已知属性:
const result = yourTestFunction(); expect(result).toEqual(expect.objectContaining({ prop1: "已知值1", prop2: "已知值2", prop3: "已知值3", expire_at: expect.stringMatching(ISO_8601_PATTERN) }));
为什么之前的写法失败?
你之前尝试的expect.toMatch(ISOPattern)是执行断言的方法,无法直接嵌入到objectContaining的结构中;而expect.stringMatching()是匹配器工厂,返回的是可用于嵌套验证的期望对象,符合Jest的断言结构要求。
兼顾简洁性与测试完整性的扩展:
如果需要验证expire_at的时间合理性(比如是当前时间前后的有效范围),可以在格式验证后补充额外断言:
// 先验证格式和固定属性 expect(result).toEqual(expect.objectContaining({ prop1: "已知值1", prop2: "已知值2", prop3: "已知值3", expire_at: expect.stringMatching(ISO_8601_PATTERN) })); // 再验证时间逻辑(例如不能早于当前时间,且不晚于1小时后) const expireTime = new Date(result.expire_at); const now = new Date(); expect(expireTime.getTime()).toBeGreaterThanOrEqual(now.getTime()); expect(expireTime.getTime()).toBeLessThanOrEqual(now.getTime() + 3600 * 1000);
这样既保持了主断言的简洁性,又通过额外步骤保证了时间逻辑的正确性。
内容的提问来源于stack exchange,提问作者jdev
相关产品推荐
相关产品推荐

