dirty-chai
的包描述对于新手来说有点不透明:
终止断言属性的函数形式
在此上下文中什么是"断言属性",终止意味着什么?为什么它们不正常;终止";?我有很多问题。一个没有脏柴的例子,一个有的例子,说明好处会很大。
我认为dirty-chai
的一个关键原因是对属性访问进行断言被认为不是一种好的做法(至少对JavaScript社区中的一些人来说是这样)。
如果没有插件chai
,您可以编写这样的测试:
chai.expect(someFunctionThatReturnsTrue(args)).to.be.true
如果测试失败,那就意味着someFunctionThatReturnsTrue(args)
一定返回了true
以外的东西,从中您可以开始调试它的代码,看看原因。
但是,为了使此测试正常运行,访问true
属性需要进行断言,并在断言失败时中断代码执行(例如,抛出异常)。
Linter通常不知道属性访问是如何进行的,默认情况下会认为访问属性不会产生任何副作用(即改变环境),尤其是不会引发异常(或导致其他控制流中断后果)。
因此,如果您编写something.true
(没有括号),linter将假定您只想访问名为true
的something
的属性。如果表达式不存在(不用于赋值、函数参数或其他求值),linter会将其标记为潜在的打字错误或其他错误。因此,chai
中先前的有效情况将生成linter错误。
在某些情况下,这类linter错误可能很有用,因为如果您试图访问不存在的属性,JavaScript不会抱怨。例如,如果您的测试代码中确实存在拼写错误,该怎么办?
chai.expect(someFunctionThatReturnsTrue(args)).to.be.ture
// ~~~~ not `true`, obviously a typo
无论someFunctionThatReturnsTrue(args)
返回什么,此测试都将通过因为访问.ture
只是返回undefined
,不会抛出错误。如果chai
强迫您忽略这些linter错误,那么您可能会错过someFunctionThatReturnsTrue()
中的一些编码错误。
更糟糕的是,如果有任何错误,您可能会认为它不在someFunctionThatReturnsTrue()
中,因为该测试(错误地)通过了。
因此,插件dirty-chai
通过属性访问将断言(如.true
)转换为将这些属性作为函数调用(.true()
),确保linters知道这些语句可以更改控制流:
chai.expect(someFunctionThatReturnsTrue(args)).to.be.true()
// Linter now knows you are expecting something to happen during `.true()` call
// and won't complain anymore
现在,如果你拼写错误,测试将失败(抛出异常)
chai.expect(someFunctionThatReturnsTrue(args)).to.be.ture()
// ~~~~ Will throw something like
// `...to.be.ture is not a function`