dirty-chai.js到底做什么?

时间:2019-01-23 17:06:06

标签: chai

对不起,但是对于新手来说,软件包描述有些不透明。 “用于终止断言属性的函数形式。”在这种情况下,什么是断言属性?终止是什么意思?为什么他们通常不“终止”这么多问题。一个没有dirtychai的示例以及一个带有dirtychai的示例,说明这样做的好处是很大的。

包装:https://www.npmjs.com/package/dirty-chai

1 个答案:

答案 0 :(得分:1)

我认为dirty-chai的主要原因之一是it is not considered good practice (at least for some in the JavaScript community) to make assertions on property access

chai允许您编写如下测试:

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

如果测试失败,则someFunctionThatReturnsTrue(args)必须返回了true以外的内容,您可以进入其代码以了解原因。但是,为了使此测试正常工作,如果声明失败(例如,引发异常),则对true属性的访问需要进行声明并中断代码执行。

Linters通常不知道如何进行属性添加,并希望假定该添加不会改变环境,尤其是不会引发异常(或带来其他控制流破坏性后果)。

因此,如果您写something.true(不带括号),则短子将假定您只是想访问名为something的{​​{1}}的属性。如果表达式无处可去(未在赋值,函数参数或其他评估中使用),则linter会认为您的代码中可能有错别字或某些内容,并产生错误来对此抱怨。因此,true中的先前有效案例将产生短绒错误。

在某些情况下,这类错误可能很有用 ,因为如果您尝试访问不存在的属性,JS不会抱怨。例如,如果您在测试代码中确实有错字怎么办?

chai

无论chai.expect(someFunctionThatReturnsTrue(args)).to.be.ture // ~~~~ not `true`, obviously a typo 返回什么,该测试都将通过。(由于访问someFunctionThatReturnsTrue(args)只会返回.ture,并且不会引发错误。)错过了undefined中的一些编码错误。更糟糕的是,如果有任何错误,您可能会认为它不在someFunctionThatReturnsTrue()中,因为它通过了测试。

通过将属性访问(如someFunctionThatReturnsTrue())中的断言转换为.true中方法(.true())中的断言,Linter知道这些语句可以改变控制流:

dirty-chai

如果您输入错误,测试将失败(抛出异常)

chai.expect(someFunctionThatReturnsTrue(args)).to.be.true()
// Linter now knows you are expecting something to happen during `.true()` call
// and won't complain anymore