- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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}
浏览对象可以发现差异,但在复杂的对象中,这并不容易。关于如何处理这个问题有什么建议吗?
最佳答案
您的问题基于两个误解:
obj2
中,c
是一个已定义的属性,其值为 undefined
。stringify()
未根据规范序列化 undefined
- 您的测试不安全两个对象不相等。
toEqual()
toEqual使用内部 util.equals()
对于 a 和 b 中定义的所有 可枚举 键,它将逐键比较对象键。
经过一些类型检查后,它进入了 comparing the keys of the object
查看 ECMAscript 规范。当您创建对象文字时,将调用此内部 Put
方法:
[...]
The production PropertyNameAndValueList : PropertyAssignment is evaluated as follows:
- Let obj be the result of creating a new object as if by the expression new Object() where Object is the standard built-in constructor with that name.
- Let propId be the result of evaluating PropertyAssignment.
- Call the [[DefineOwnProperty]] internal method of obj with arguments propId.name, propId.descriptor, and false.
- Return obj.
[...]
The production PropertyAssignment : PropertyName : AssignmentExpression is evaluated as follows:
- Let propName be the result of evaluating PropertyName.
- Let exprValue be the result of evaluating AssignmentExpression.
- Let propValue be GetValue(exprValue).
- Let desc be the Property Descriptor{[[Value]]: propValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}
类似的通过成员表达式定义属性:
8.12.5 [[Put]] ( P, V, Throw ) When the [[Put]] internal method of O is called with property P, value V, and Boolean flag Throw, the following steps are taken:
[...]
Else, create a named data property named P on object O as follows
a. Let newDesc be the Property Descriptor {[[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}.
b. Call the [[DefineOwnProperty]] internal method of O passing P, newDesc, and Throw as arguments.
DefineOwnProperty
的实现,在 8.12.9 [[DefineOwnProperty]] (P, Desc, Throw) 中有描述,不再赘述。还有 MDN says即使是默认值也是 undefined
。
检查:
> var obj2 = {a: 1, b: 2, c: undefined };
> obj2.hasOwnProperty("c");
< true
stringify()
看看 ECMAscript spec on stringify()
或在 JSON spec :
(来源:json.org)
这是 ECMAscript 规范的一部分:
- Else a. Let K be an internal List of Strings consisting of the names of all the own properties of value whose [[Enumerable]] attribute is true. The ordering of the Strings should be the same as that used by the Object.keys standard built-in function.
他们说,该对象的枚举属性应符合 Object.keys()
的顺序(和结果)。让我们测试一下......
> var obj2 = {a: 1, b: 2, c: undefined };
> Object.keys(obj2);
< ["a", "b", "c"]
嗯,他们是对的!
然后是 Str()
函数,它定义了处理 undefined
值的行为。有几个 If Type() ...
步骤不适用于 undefined 值,以
- Return undefined.
当被对象序列化器调用时:
For each element P of K.
a. Let strP be the result of calling the abstract operation Str with arguments P and value.
b. If strP is not undefined
[...]
关于javascript - Jasmine toEqual 失败但打印两个对象是相同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42264188/
我正在尝试为我的范围变量之一编写规范,但即使它们匹配也失败了。 控制台: Expected [ { id: 1, name: 'Browns', created_at: '2014-08-06T2
In this Jasmine test我比较了两个几乎相同的对象,唯一的区别是第二个对象多了一个未定义的成员。 describe('Testing', function () { it('sho
我查找了 jasmine 源代码,但没有正确找到 toEquals 的实现,我找到的内容如下,在 https://github.com/jasmine/jasmine/blob/master/lib/
目前,我有一个函数,有时会返回一个内部包含一些函数的对象。当使用 expect(...).toEqual({...}) 时,它似乎与那些复杂的对象不匹配。具有函数或 File 类(来自输入类型文件)的
我有一个像这样的 Jasmine 测试: expect(array.length).toEqual(0); 这就过去了。出于好奇,我将其更改为: expect(array.length).toEqua
我正在使用 expect(item).toEqual(otherItem)。根据我读过的所有内容,expect({ a: "a", b: undefined }).toEqual({ a: "a"})
我正在尝试使用函数.not.toEqual() 来测试两个对象是否不同。 据我了解,这个函数应该对我的对象的值进行递归比较。尽管如此,我似乎无法得到我期望的结果。 这是在我的终端中打印出来的内容的摘录
我有以下 Jasmine 单元测试: describe('getAlertsByUserId', function () { it('should get alerts from api/Al
我正在尝试使用 jasmine 测试我的组件,但我不确定为什么我失败 这是y代码 https://stackblitz.com/edit/angular-bup8gb describe('initia
我必须通过以下声明文本: expect(accessPolicyPage.accessPolicyName).toEqual(element.all(by.binding("pol.name")).g
我创建了一个服务来屏蔽数据并编写了一个 Jasmine 测试来比较实际对象和预期对象。当我运行测试时,我在从服务返回的 actual 对象上得到了 undefined 。虽然当我控制台记录它时 con
在了解了 comparison operators === and == 之间的差异之后在 Javascript 中,Jasmines 的相等概念与任何一个都不对应,这让我感到非常惊讶。例如,以下测试
我正在关注 Dan Abramov 关于 Redux 的教程。 ( https://egghead.io/lessons/javascript-redux-avoiding-object-mutati
我正在尝试为 React JS 运行单元测试 - 使用 jest/enzyme。 目前测试失败。不太清楚为什么,也许我没有正确调用 expect(wrapper.find)。这是我测试的一部分: F
我正在编写一系列测试来演示“this”在不同上下文中的值(value)。 这是我当前的测试套件: describe("this keyword", function(){ it('return
我明白为什么以下返回 false... expect({}).toBe({}); 我明白了为什么以下返回 true... expect({}).toEqual({}); 但为什么下面的为真? expe
我是 jest 的新手,所以我不确定这是否是我的错。所以这是我的测试用例 it('should throw error if wrong email or phone number is pr
我一直在尝试比较 jasmine 中的两个 javascript 对象。但我收到错误对象读取没有方法调用。 describe("AutoEditor", function() { var widg
Jest 文档如下: toBe just checks that a value is what you expect. It uses === to check strict equality. 对
我是 Jasmine 的新手,遇到过我期望是 String 或 null 的情况。我试图在 toEqual 中执行 or ,但我看到了一些奇怪的结果,这让我相信我正在以错误的方式处理这个问题。处理这种
我是一名优秀的程序员,十分优秀!