Chai 中 deep 对象比较的正确方法

Chai 中 deep 对象比较的正确方法

在前端开发中,我们常常需要比较两个对象是否相等。一般情况下,我们可以使用 assert.deepEqualexpect(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.deepStrictEqualexpect(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.deepEqualexpect(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.deepStrictEqualexpect(obj).to.deep.equal 方法和 assert.deepEqualexpect(obj).to.eql 方法。具体选择哪一种方法,可以根据需要进行选择。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b115a5add4f0e0ffa6413a