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