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();

链长/参数

这会破坏 lengtharguments 断言,当它们在链中位于任何其他断言之后时。为了解决此限制,请先在链中执行 lengtharguments 断言,或者只执行多个断言语句。

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();