将两个不同的对象与茉莉花.toEqual进行比较,一个对象为空,另一个对象的键为符号,为什么它表示它们相等?

问题描述 投票:2回答:1

这是我的期望声明

const otherObject = { [Symbol('what')]: { key: 'value' } };
expect({}).toEqual(otherObject); // succeeds

期望测试失败。

为什么茉莉花报告该测试成功?我正在使用[email protected]

这里是代码框https://codesandbox.io/s/floral-platform-rceq0

javascript node.js unit-testing jasmine
1个回答
0
投票

目前仅使用Symbol作为键无法使用。当jasmine进行比较时,它将尝试获取对象的keys,请参见jasmine.js#L4551,用于提取键的函数使用Object.keys,请参见jasmine.js#L4587

请参见以下示例

const otherObject = { [Symbol('what')]: { key: 'value' } };
console.log(Object.keys(otherObject)); // ouput []

因此,当jasmine运行比较expect({}).toEqual(otherObject);时,它是在使用深度相等性比较来比较{}是否等于{},并且它是true,实际上是在比较两个空对象。

使用以下应失败的示例也不起作用,但它通过了:

const mySymbol = Symbol('what');
const otherObject = { [mySymbol]: { key: 'value' } };
expect(otherObject).toEqual(
  jasmine.objectContaining({ [mySymbol]: { key: 'value2' } })
);

因此,您可以使用Object.getOwnPropertySymbols迭代对象并为每个值写一个期望值。

或者,您可以向Jasmine团队提出功能请求,以便他们考虑验证Symbols而不只是密钥。

https://github.com/jasmine/jasmine/issues

希望有帮助

© www.soinside.com 2019 - 2024. All rights reserved.