Jest 本身不支持直接在 expect.objectContaining 中使用通配符键(如 [expect.any(String)])来匹配任意键名,但可通过 Object.entries() 结合 expect.arrayContaining 或 toEqual 实现对动态键对象的值级精准断言。
jest 本身不支持直接在 `expect.objectcontaining` 中使用通配符键(如 `[expect.any(string)]`)来匹配任意键名,但可通过 `object.entries()` 结合 `expect.arraycontaining` 或 `toequal` 实现对动态键对象的值级精准断言。
在 Jest 测试中,当待断言的对象包含不可预测的动态键(例如 UUID、哈希字符串等),而你只关心键对应的值是否符合预期时,无法直接用嵌套的 expect.objectContaining 描述“任意键 → 固定值”的结构——因为 Jest 的匹配器不支持将 expect.any(...) 作为对象字面量的计算属性名(即 [expect.any(String)]: ... 是语法错误且语义无效)。
此时推荐采用解构 + 显式遍历校验的策略:提取 value.foo 的键值对,再对 entries 数组进行断言。这种方式既保持类型安全(尤其配合 TypeScript),又具备高度可读性与可扩展性。
✅ 正确做法示例:
test('matches dynamic keys in value.foo and validates bigint array values', () => {
const { value } = value; // 假设原始数据变量名为 value
// 断言 foo 对象中恰好有一组 [key, value],key 为任意字符串,value 为 [1n, 100n]
expect(Object.entries(value.foo)).toEqual([
[expect.any(String), [1n, 100n]]
]);
});⚠️ 注意事项:
- Object.entries() 返回 [key, value] 元组数组,顺序与对象枚举顺序一致(ES2015+ 规范保证字符串/数字键按插入顺序,Symbol 键排最后),因此 toEqual 要求条目数量、顺序和内容完全一致;
- 若允许多个动态键(如 foo: { a: [1n], b: [2n] }),应改用 expect.arrayContaining 并配合 expect.objectContaining 校验每个条目:
expect(Object.entries(value.foo)).toEqual( expect.arrayContaining([ expect.arrayContaining([expect.any(String), [1n]]), expect.arrayContaining([expect.any(String), [2n]]) ]) ); - 对于 bigint 类型,请确保测试运行环境支持(Node.js ≥ v10.4.0),且避免混用 1(number)与 1n(bigint)——Jest 会严格区分二者,[1, 100] 与 [1n, 100n] 不相等;
- 若需同时校验 context.version(如题中为 1.0,属 number 类型),请修正原问题中的 expect.any(String) 为 expect.any(Number),否则断言失败:
context: expect.objectContaining({ version: expect.any(Number) })
总结:面对动态键对象,放弃“声明式键通配”幻想,转向“命令式结构解析 + 精确值断言”。Object.entries() 是连接不可预测键与可验证值的最简洁、最可靠桥梁。

















