dirty-chai
用于终止断言属性的函数形式。
安装
npm install dirty-chai --save-dev
用法
dirty-chai
是 chai 的一个 插件。
var chai = require('chai');
var dirtyChai = require('dirty-chai');
var expect = chai.expect
chai.use(dirtyChai);
// ...
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,您应该在 dirty-chai 之前 .use
chai-as-promised
var chai = require("chai");
var chaiAsPromised = require("chai-as-promised");
var dirtyChai = require("dirty-chai");
chai.use(chaiAsPromised);
chai.use(dirtyChai);
插件断言
此插件还将挂钩并转换其他 Chai 插件添加的任何属性断言。您需要做的唯一事情是确保在任何其他插件之前加载 dirty-chai,以便它可以在其他插件加载之前将其钩子放到位。
例如,如果您在 dirty-chai 之后加载 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 编写的/为 Chai 编写的庞大生态系统项目和插件,同时仍然能够信任您的测试。它将内置的属性断言转换为方法断言,包括插件添加的任何属性断言。
受影响的断言列表,以及插件添加的许多断言,是属性 getter,它们在访问时立即断言。因此,它们被编写为通过终止断言链并使用属性访问来使用。
expect(true).to.be.true;
foo.should.be.ok;
一个更好的选择是为这些断言提供函数调用形式,以便代码的意图更清晰,linter 停止抱怨一些看起来不对劲的东西。此形式是在现有属性访问形式的基础上添加的,不会影响现有的测试代码。
expect(true).to.be.true();
foo.should.be.ok();