【问题标题】:Compare two different objects with jasmine .toEqual, and one object is empty and the other has a key that is a symbol, why does it say they are equal?用 jasmine .toEqual 比较两个不同的对象,一个对象是空的,另一个对象的键是符号,为什么说它们相等?
【发布时间】:2020-05-07 22:55:30
【问题描述】:
【问题讨论】:
标签:
javascript
node.js
unit-testing
jasmine
【解决方案1】:
目前无法使用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
希望对你有帮助