在 Chai 断言库中,当我们已经有“assert.deepEqual()”和“assert.strictEqual()”时,“assert.equal()”有啥用?
Posted
技术标签:
【中文标题】在 Chai 断言库中,当我们已经有“assert.deepEqual()”和“assert.strictEqual()”时,“assert.equal()”有啥用?【英文标题】:In Chai assertion library what is the use of "assert.equal()" when we already have "assert.deepEqual()" and "assert.strictEqual()"?在 Chai 断言库中,当我们已经有“assert.deepEqual()”和“assert.strictEqual()”时,“assert.equal()”有什么用? 【发布时间】:2020-11-24 17:23:53 【问题描述】:在 Chai 断言库中,当我们已经有“assert.deepEqual()”时,“assert.equal()”有什么用? " 和 "assert.strictEqual()" 用于严格和深度相等断言? 还提到“assert.equal()”使用非严格相等。非严格平等和深度平等有什么区别? 为什么我们不能只使用“deepEqual”而不是“equal”?
【问题讨论】:
【参考方案1】:当您查看 Chai documentation 中的 .deep
函数时,您会得到非常清晰的描述:
导致所有 .equal、.include、.members、.keys 和 .property 断言 在链中使用深度相等而不是严格(===) 平等。
当您使用equal
时,Chai 使用===
比较。所以在比较对象时,Chai 会检查 reference。
当您使用deepEqual
时,Chai 将沿着对象层次结构向下比较每个属性的每个值。
例子:
const a = "a": "a";
const b = "a": "a";
expect(a).to.equal(b); // false, as a refers to a different object than b
expect(a).to.deep.equal(b); // true, as the value of every property of a and b equals
【讨论】:
我提到了柴“断言”而不是“预期”.....对于“预期”,我们只有“平等”和“深度平等”,这很好。但是对于 Chai 中的“assert”,我们有“equal”、“strictEqual”和“deepEqual”。【参考方案2】:https://www.chaijs.com/api/assert/
javascript主要作为3比较,
== , === 和 Object.is(obj1,obj2)
double equals (==
) 将在比较两个事物时执行类型转换,并将处理NaN
、-0
和+0
专门符合 IEEE 754 (所以NaN != NaN
和 @987654328 @); 三等号 (===
) 将进行与双等号相同的比较(包括对NaN
、-0
和+0
的特殊处理),但不进行类型转换;如果类型不同,则返回false
。Object.is
不对NaN
、-0
和+0
进行类型转换和特殊处理(除了那些特殊的数值外,它的行为与===
相同)。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#a_model_for_understanding_equality_comparisons
但所有这些比较仅适用于原始值(非对象,例如:string、number、bigint、boolean、undefined、symbol 和 null。)
对于 Object ,它也会考虑引用,这意味着它将检查对象是否具有相同的引用,否则它将等同于 false。因此,我们不能使用这三种方法中的任何一种来比较对象
assert.equal 执行 '==' assert.strict 执行 '===' assert.deep 递归地检查键、值和成员而不是引用(如此深入的内容验证)
【讨论】:
以上是关于在 Chai 断言库中,当我们已经有“assert.deepEqual()”和“assert.strictEqual()”时,“assert.equal()”有啥用?的主要内容,如果未能解决你的问题,请参考以下文章