【问题标题】: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
【问题描述】:

这是我的期望声明

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

期望是测试失败。

为什么 jasmine 报告此测试成功?我正在使用 jasmine@3.5

这里是密码箱https://codesandbox.io/s/floral-platform-rceq0

【问题讨论】:

    标签: 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

    希望对你有帮助

    【讨论】:

    • 感谢链接的详细解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多