assert.equal是否比assert(assert.ok)提供任何优势?

时间:2015-12-23 17:34:10

标签: node.js assert

在这个问题中,我引用了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

在这种情况下,前者对后者有明显的优势吗?

3 个答案:

答案 0 :(得分:2)

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

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

第一个陈述会给你一条消息:

actual: number
expected: string

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

AssertionError: false == true

另请注意,如果要检查严格相等(===),则应使用assert.strictEqual代替assert.equal

答案 1 :(得分:1)

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

答案 2 :(得分:1)

两者都有效。

首先,assert使用强制 ==运算符,而非严格 ===

此外,当您阅读大量的单元测试或其他人的单元测试时,您会对重复的语法感到紧张。当人们写这篇文章时你会喜欢它

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.

总结一下,优点在于单元测试的可读性(因此可维护性)。它并不多,但它有助于编写更易理解的代码。

正如亚历山大所说,如果你没有指定消息,当测试失败时,你会得到更精确的错误消息。