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

如何在expect.objectContaining中使用正则表达式进行测试

在对象匹配中验证ISO 8601格式属性的简洁方法

你可以用Jest内置的expect.stringMatching()匹配器,它专门支持在expect.objectContaining()这类嵌套断言场景中验证字符串格式,完美解决你遇到的问题。

具体实现步骤:

  1. 先定义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})$/;
  1. 直接在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:15:35