chai-parentheses
与 dirty-chai API 兼容的分支,因为 dirty-chai 在与现代打包器一起使用时存在问题
用于终止断言属性的函数形式。
安装
npm install chai-parentheses --save-dev
使用
chai-parentheses
是一个 chai 插件。
var chai = require('chai');
var parentheses = require('chai-parentheses');
var expect = chai.expect
chai.use(parentheses);
// ...
expect(true).to.be.true();
自定义错误消息
使用这种用于终止属性的函数形式,您还可以提供自定义错误消息以在断言失败时显示。这适用于断言位于链中间或链末尾。
expect(true).to.be.true.and.not.false('Reason: Paradox');
expect(true).to.be.true('The fabric of logic has torn').and.not.false();
受影响的断言
此插件修改了以下内置断言,现在使用函数调用形式
- ok
- true
- false
- null
- undefined
- exist
- empty
- arguments
- Arguments
注意事项
始终以函数结束
这些形式也可以混合使用,但链必须始终以函数形式结束,否则链中到该点的断言将不会执行。
expect(true).to.be.true.and.not.false();
expect(true).to.be.true().and.not.false();
链长/参数
这会破坏 length
和 arguments
断言,当它们在链中位于任何其他断言之后时。为了解决此限制,请先在链中执行 length
或 arguments
断言,或者只执行多个断言语句。
myArray.should.exist.and.should.have.length(3); // Error: length is not a function
// Do two assert statements instead
myArray.should.exist();
myArray.should.have.length(3);
与 chai-as-promised 一起使用
如果您使用的是 chai-as-promised,则应在 chai-parentheses 之前 .use
chai-as-promised
var chai = require("chai");
var chaiAsPromised = require("chai-as-promised");
var parentheses = require("chai-parentheses");
chai.use(chaiAsPromised);
chai.use(parentheses);
插件断言
此插件还将挂钩并转换由其他 Chai 插件添加的任何属性断言。您需要做的唯一一件事是确保在任何其他插件之前加载 chai-parentheses,以便它可以在其他插件加载之前到位。
例如,如果您在 chai-parentheses 之后加载 sinon-chai,那么它的所有属性断言现在都将是方法断言。
spy.should.have.been.called();
spy.should.have.been.calledOnce();
spy.should.have.been.calledTwice();
为什么?
Chai 可能是 node 中最流行的断言库之一。它有超过 400 个依赖项,每月下载量接近 500,000 次。
出于风格原因,Chai 的设计使得任何不需要参数的断言都只断言属性访问。这允许这些断言省略如果这些断言是方法将需要的空括号。
此设计决定对您对测试的信任程度有很大影响,尤其是在您没有严格遵守 TDD 的红绿重构流程的情况下。有关详细说明为什么,请阅读 警惕断言属性访问的库。
还有来自 JSHint 等 linter 的错误问题。如果您正在对测试代码进行 lint,您的 linter 将会抱怨类似“预期赋值或函数调用,但看到了表达式”的错误。由于 linter 不了解属性 getter,它假定此行没有副作用,并在您可能犯了错误的情况下发出警告。
压制这些错误不是一个好的解决方案,因为测试代码正在变得与生产代码一样重要,甚至更重要。使用静态分析在测试中捕获语法错误是一个很好的工具,可以帮助确保您的测试定义明确,没有错别字。
编写此插件是为了让我们仍然可以利用为 Chai 编写的庞大项目和插件生态系统,同时仍然能够信任您的测试。它将内置属性断言转换为方法断言,包括由插件添加的任何属性断言。
受影响的断言列表以及许多由插件添加的断言是属性 getter,它们在访问时立即断言。因此,它们被编写为通过属性访问来终止断言链来使用。
expect(true).to.be.true;
foo.should.be.ok;
一个更好的选择是为这些断言提供一个函数调用形式,以便代码的意图更加清晰,并且 linter 停止抱怨某些事情看起来不对劲。此形式是除了现有的属性访问形式之外添加的,并且不会影响现有的测试代码。
expect(true).to.be.true();
foo.should.be.ok();