Chai 中 deep 对象比较的正确方法
在前端开发中,我们常常需要比较两个对象是否相等。一般情况下,我们可以使用 assert.deepEqual
或 expect(obj).to.deep.equal
进行比较。不过,在对深层嵌套的对象进行比较时,这些方法可能不能正确地进行比较,从而导致测试失败。在这种情况下,我们需要使用 Chai 中 deep 对象比较的正确方法。
什么是深度比较?
深度比较指的是比较两个对象(或数组)的所有属性(或元素),包括嵌套的属性(或元素),而不仅仅是比较它们的引用。例如,对于以下两个对象:
----- ---- - - -- -- -- - -- --- -- - -- ----- ---- - - -- -- -- - -- --- -- - --
如果我们使用 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 中所推荐的一种比较方法。它可以正确地比较两个对象,并且可以区分类型和对象上原型链的属性。例如:
----- ---- - - -- -- -- - -- --- -- - -- ----- ---- - - -- -- -- - -- --- -- - -- ----- ---- - - -- ---- -- - -- --- -- - -- ---------------------------- ------ -- ---- ---------------------------- ------ -- --------------- -------- - -- -- -- - -- - -- - - - - -- ------ ----- - -- ---- -- - -- - -- - - - - --------------------------------- -- ---- --------------------------------- -- --------------- -------- - -- -- -- - -- - -- - - - - -- ------ ----- - -- ---- -- - -- - -- - - - -
方法一所用的方法较为简洁明了。
方法二:使用 assert.deepEqual
或 expect(obj).to.eql
如果默认使用方法一的方法,它可能无法正确比较 Buffer 对象的深层属性,从而导致测试结果不正确。在这种情况下,我们可以使用另一种比较方法。与方法一相比,这种方法使用 assert.deepEqual
方法或 expect(obj).to.eql
断言,并且不会区分类型和对象上原型链的属性。例如:
----- ---- - - -- -- -- - -- --- -- - -- ----- ---- - - -- -- -- - -- --- -- - -- ----- ---- - - -- ---- -- - -- --- -- - -- ---------------------- ------ -- ---- ---------------------- ------ -- ----- -------------------------- -- ---- -------------------------- -- ----
当我们需要比较两个对象的深度属性时,这两种比较方法都是可以使用的。具体选择哪一种方法,可以根据需要进行选择。
总结
Chai 中 deep 对象比较的正确方法是判断两个对象包括嵌套的属性值是否相等,而不是比较它们的引用。常用的比较方法有 assert.deepStrictEqual
或 expect(obj).to.deep.equal
方法和 assert.deepEqual
或 expect(obj).to.eql
方法。具体选择哪一种方法,可以根据需要进行选择。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65b115a5add4f0e0ffa6413a