dirty-chai.js到底做什么



dirty-chai的包描述对于新手来说有点不透明:

终止断言属性的函数形式

在此上下文中什么是"断言属性",终止意味着什么?为什么它们不正常;终止";?我有很多问题。一个没有脏柴的例子,一个有的例子,说明好处会很大。

我认为dirty-chai的一个关键原因是对属性访问进行断言被认为不是一种好的做法(至少对JavaScript社区中的一些人来说是这样)。

如果没有插件chai,您可以编写这样的测试:

chai.expect(someFunctionThatReturnsTrue(args)).to.be.true

如果测试失败,那就意味着someFunctionThatReturnsTrue(args)一定返回了true以外的东西,从中您可以开始调试它的代码,看看原因。

但是,为了使此测试正常运行,访问true属性需要进行断言,并在断言失败时中断代码执行(例如,抛出异常)。

Linter通常不知道属性访问是如何进行的,默认情况下会认为访问属性不会产生任何副作用(即改变环境),尤其是不会引发异常(或导致其他控制流中断后果)。

因此,如果您编写something.true(没有括号),linter将假定您只想访问名为truesomething的属性。如果表达式不存在(不用于赋值、函数参数或其他求值),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`

最新更新