Chai 中 deep 对象比较的正确方法
在前端开发中,我们常常需要比较两个对象是否相等。一般情况下,我们可以使用 assert.deepEqual
或 expect(obj).to.deep.equal
进行比较。不过,在对深层嵌套的对象进行比较时,这些方法可能不能正确地进行比较,从而导致测试失败。在这种情况下,我们需要使用 Chai 中 deep 对象比较的正确方法。
什么是深度比较?
深度比较指的是比较两个对象(或数组)的所有属性(或元素),包括嵌套的属性(或元素),而不仅仅是比较它们的引用。例如,对于以下两个对象:
const obj1 = { a: 1, b: { c: [2, 3] } }; const obj2 = { a: 1, b: { c: [2, 3] } };
如果我们使用 assert(obj1 === obj2)
或 expect(obj1).to.equal(obj2)
进行比较,将会返回 false
,因为它们指向的是两个不同的对象。而如果我们使用 assert.deepEqual(obj1, obj2)
或 expect(obj1).to.deep.equal(obj2)
进行比较,将会返回 true
,因为它们的属性值是相等的。
Chai 中 deep 对象比较的正确方法
当需要比较两个对象的深度属性时,我们可以考虑使用 Chai 中提供的多种方法。下面将介绍两种比较方法:
方法一:使用 assert.deepStrictEqual
或 expect(obj).to.deep.equal
这是 Chai 中所推荐的一种比较方法。它可以正确地比较两个对象,并且可以区分类型和对象上原型链的属性。例如:
const obj1 = { a: 1, b: { c: [2, 3] } }; const obj2 = { a: 1, b: { c: [2, 3] } }; const obj3 = { a: '1', b: { c: [2, 3] } }; assert.deepStrictEqual(obj1, obj2); // true assert.deepStrictEqual(obj1, obj3); // AssertionError: Expected { a: 1, b: { c: [ 2, 3 ] } } to deeply equal { a: '1', b: { c: [ 2, 3 ] } } expect(obj1).to.deep.equal(obj2); // pass expect(obj1).to.deep.equal(obj3); // AssertionError: expected { a: 1, b: { c: [ 2, 3 ] } } to deeply equal { a: '1', b: { c: [ 2, 3 ] } }
方法一所用的方法较为简洁明了。
方法二:使用 assert.deepEqual
或 expect(obj).to.eql
如果默认使用方法一的方法,它可能无法正确比较 Buffer 对象的深层属性,从而导致测试结果不正确。在这种情况下,我们可以使用另一种比较方法。与方法一相比,这种方法使用 assert.deepEqual
方法或 expect(obj).to.eql
断言,并且不会区分类型和对象上原型链的属性。例如:
const obj1 = { a: 1, b: { c: [2, 3] } }; const obj2 = { a: 1, b: { c: [2, 3] } }; const obj3 = { a: '1', b: { c: [2, 3] } }; assert.deepEqual(obj1, obj2); // true assert.deepEqual(obj1, obj3); // false expect(obj1).to.eql(obj2); // pass expect(obj1).to.eql(obj3); // fail
当我们需要比较两个对象的深度属性时,这两种比较方法都是可以使用的。具体选择哪一种方法,可以根据需要进行选择。
总结
Chai 中 deep 对象比较的正确方法是判断两个对象包括嵌套的属性值是否相等,而不是比较它们的引用。常用的比较方法有 assert.deepStrictEqual
或 expect(obj).to.deep.equal
方法和 assert.deepEqual
或 expect(obj).to.eql
方法。具体选择哪一种方法,可以根据需要进行选择。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65b115a5add4f0e0ffa6413a