在这个问题中,我引用了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
在这种情况下,前者对后者有明显的优势吗?
答案 0 :(得分:2)
好吧,根据测试运行器框架,assert.equal
可能会为您提供更具描述性的错误消息。例如,在这种情况下:
assert.equal(typeof path, "string");
assert(typeof path === "string");
第一个陈述会给你一条消息:
actual: number
expected: string
已经告诉您测试用例失败,因为typeof path
是number
。
后者只打印这样的东西:
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.
总结一下,优点在于单元测试的可读性(因此可维护性)。它并不多,但它有助于编写更易理解的代码。
正如亚历山大所说,如果你没有指定消息,当测试失败时,你会得到更精确的错误消息。