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

链长/参数

这会破坏 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,您应该在 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();