【发布时间】:2017-02-21 04:08:05
【问题描述】:
In this Jasmine test我比较了两个几乎相同的对象,唯一的区别是第二个对象多了一个未定义的成员。
describe('Testing', function () {
it('should compare two objects', function () {
var obj1 = {a: 1, b: 2 };
var obj2 = {a: 1, b: 2, c: undefined };
console.log(JSON.stringify(obj1));
console.log(JSON.stringify(obj2));
expect(obj1).toEqual(obj2);
});
测试失败,但是使用JSON.stringify 打印两个对象会产生两个相同的输出。
{"a":1,"b":2}
{"a":1,"b":2}
浏览对象可以发现差异,但在复杂对象中,这并不容易。关于如何解决这个问题的任何建议?
【问题讨论】:
-
in javascript ...
({}) != ({})所以,在对象中没有任何机会 -
JSON 没有
undefined值,因此JSON.stringify会忽略该类型的任何内容。这两个对象不相等——一个有一个额外的属性——所以 Jasmine 很自然地告诉你。你在这里发现了什么问题? -
我将完全相同的代码(加上缺少的最终
});)复制到一个使用react-scripts test --env=jsdom执行测试的 React 项目中。这里的测试是用 jest,而不是 jasmine,但 jest 至少部分是建立在 jasmine 上的。当我运行测试时,它通过了,正如我认为的那样。如果我强制测试失败(通过将.not添加到expect语句中)只是为了查看输出,我会得到以下信息:Expected value to not equal: {"a": 1, "b": 2, "c": undefined}; Received: {"a": 1, "b": 2}。 -
@JaromandaX,关于 JavaScript 中的对象(不)相等性,您是对的,但 Jasmine
toMatch方法比较对象属性值,与==或===不同。 -
我上面关于
toMatch的评论应该是关于toEqual的。更正此错字后,该评论仍然正确。通过引用比较对象需要toBe,而不是toEqual。
标签: javascript jasmine jasmine2.0