assert.equal 是否比断言 (assert.ok) 有任何优势?

Does assert.equal offer any advantages over assert (assert.ok)?

在这个问题中,我指的是包含在 node.js 核心中的 assert 模块。

据我所知,以下两个断言几乎相同:

assert.equal(typeof path, "string", "argument 'path' must be a string");
assert(typeof path === "string", "argument 'path' must be a string");

失败时,两个变体报告相同的消息:

AssertionError: argument 'path' must be a string

在这种情况下,前者比后者有什么显着优势吗?

assert.equal 不检查身份,只检查是否相等。相当于:

assert(typeof path == 'string', "argument 'path' must be a string");

真正的等价物是 assert.strictEqual,它使用恒等运算符 ===:

assert.strictEqual(typeof path, "string", "argument 'path' must be a string");

对于typeof,不,没有区别。不过,您会 运行 遇到其他数据类型的问题:

> assert.equal('test', ['test']);
undefined
> 'test' == ['test']
true
> 'test' === ['test']
false

好吧,根据测试运行器框架,assert.equal 可能会为您提供更具描述性的错误消息。例如,在这种情况下:

assert.equal(typeof path, "string");
assert(typeof path === "string");

第一个语句会给你一条消息:

actual: number
expected: string

这已经告诉您测试用例失败了,因为 typeof pathnumber。 后者只会打印这样的东西:

AssertionError: false == true

此外,请注意,如果要检查严格相等性 (===),则应使用 assert.strictEqual 而不是 assert.equal

两者都可以。

首先,assert 使用 强制 == 运算符,而不是 strict ===

此外,当您阅读大量单元测试或其他人的单元测试时,您会因重复的语法而疲劳。当人们写这篇文章时,你会喜欢的

assert.equal(aValue, anotherValue) // sexy

/** But you will hate people writing this. **/
assert.ok(aValue == anotherValue) // ugly

在第一种情况下,您可以在前 9 个字母中看到正在检查的条件。您甚至不需要 进一步。在另一种情况下,您必须阅读 20 个字母才能知道测试在检查什么。它更神秘

此外,assert.equal 比 assert.ok 更能表达您的意图。

假设您正在编写用于测试集合交集的测试。你会读得更好

assert.setIntersect(set1, set2) // wow

assert.ok(setIntersect(set1, set2)); // hm.

总而言之,优势在于单元测试的可读性(因此可维护性)。它并不多,但它有助于编写更好理解的代码。

正如 alexander 所说,如果您不指定消息,那么当测试失败时,您将获得更准确的错误消息。