在这个问题中,我提到了包含在断言核心中的node.js模块。
据我所知,以下两个断言几乎完全相同:
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在这种情况下,前者比后者有什么显著的优势吗?
发布于 2015-12-23 17:47:36
根据测试运行程序框架的不同,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。
发布于 2015-12-23 17:44:23
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发布于 2015-12-23 17:48:44
两者都会起作用的。
首先,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.总而言之,它的优点是单元测试的可读性(因此是可维护性)。这并不多,但它有助于编写更好理解的代码。
正如alexander所说的,如果不指定消息,那么在测试失败时,您将获得更精确的错误消息。
https://stackoverflow.com/questions/34440927
复制相似问题