在 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 的特殊处理),但不进行类型转换;如果类型不同,则返回falseObject.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()”有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

对超测响应的异步 chai 断言

函数 assert() 是干啥的 包含在哪个库中

Chai-As-Promised 正在吃断言错误

C++ 断言

Chai 中的“assert”、“expect”和“should”有啥区别?

Sinon chai 否定断言不适用于期望