在前端的单元测试中,我们经常使用 Chai 库来进行断言,其中 equal
和 deep.equal
是两个非常常用的断言方法。但是,在实际使用中,我们有时会发现它们的效果并不相同,那么它们究竟有什么差异呢?如何正确地使用它们呢?本文将详细介绍这两种断言方法的差异及使用方法。
1. equal 和 deep.equal 的定义
在 Chai 中,equal
和 deep.equal
的含义分别如下:
equal
:比较两个变量或对象是否严格相等(===);deep.equal
:比较两个对象是否深度相等,即它们的属性值及属性内部的嵌套对象的值是否相等。
2. equal 和 deep.equal 的应用场景及差异
2.1 equal 的应用场景及限制
当我们需要比较两个基本类型的变量时,可以使用 equal
断言方法:
const str1 = 'hello world'; const str2 = 'hello world'; expect(str1).to.equal(str2); // 通过
但需要注意的是,equal
比较的是变量的类型和值是否完全相同(即严格相等),类型和值都必须相同才会判断相等,示例如下:
expect(1).to.equal('1'); // 不通过 expect(NaN).to.equal(NaN); // 不通过 expect(null).to.equal(undefined); // 不通过
因此,equal
的局限性比较大,不适用于比较复杂的对象和嵌套的数组等数据类型。
2.2 deep.equal 的应用场景
相对于 equal
,deep.equal
更灵活,可以比较所有类型的数据,无论是简单的基本类型还是复杂的对象和嵌套的数组,只要值相等,就可通过比较。示例如下:
const obj1 = { a: 'hello', b: { c: 'world' } }; const obj2 = { a: 'hello', b: { c: 'world' } }; expect(obj1).to.deep.equal(obj2); // 通过
2.3 deep.equal 与 equal 的差异
使用 deep.equal
比 equal
更灵活,但也存在一些局限性。在进行深度比较的时候,deep.equal
只比较对象具有的可枚举的自有属性,而原型链上的属性不会被考虑,示例代码如下:
-- -------------------- ---- ------- ----- ------ - ----------------- ---- - --------- - ----- -------- - ---- - - ----------------------- - ------- -- ----- ----- ------- - --- -------------- ---- ----- ------- - --- -------------- ---- --------------------------------------- -- -- -------------- - --------- --------------------------------------- -- ---
在上面的代码中,虽然两个 person 对象的属性值都相等,但是其原型链上的属性值不相等,因此,使用 deep.equal
断言时也会因原型链属性的不同而判断不相等。
3. deep.equal 的使用方法
由于 deep.equal
的灵活性和使用范围广,我们在编写测试用例时经常使用这种方法来比较复杂的对象和嵌套的数组。下面列举一些使用 deep.equal
的示例:
3.1 比较两个数组
const arr1 = [1, { a: 2 }]; const arr2 = [1, { a: 2 }]; expect(arr1).to.deep.equal(arr2); // 通过
3.2 比较两个对象
-- -------------------- ---- ------- ----- ---- - - -- -- -- - -- --- --- -- -- ----- ---- - - -- -- -- - -- --- --- -- -- --------------------------------- -- --
3.3 比较两个 Set 对象
const set1 = new Set([1, 2, 3]); const set2 = new Set([1, 2, 3]); expect(set1).to.deep.equal(set2); // 通过
3.4 比较两个 Map 对象
-- -------------------- ---- ------- ----- ---- - --- ----- ----- --- ----- - -- - --- --- ----- ---- - --- ----- ----- --- ----- - -- - --- --- --------------------------------- -- --
4. 总结
equal
和 deep.equal
两个方法都是常用的断言方法,但它们的适用范围和比较方式有所不同。在实际使用中,我们应该选择合适的方法进行比较,避免出现错误的测试结果,从而提高代码的质量和可靠性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647ae544968c7c53b068246d