Chai 断言数量

CI npm version Downloads License

ChaiJS 插件允许检查每个测试运行了多少个断言或期望。

为什么我们需要检查它?

让我们看看这个测试

import InstanceGenerator from '../lib/instances-generator';

describe('suite #1', () => {
  it('test #1', () => {
    class S1T1A {
      /* Other props and methods are skipped */
      /**
       * I'm called after any instance of S1T1A is created
       */
      afterCreate(...args) {
        // I need to check `args` here
        // chai.expect(args)... 
      }
    }
    InstanceGenerator.create(S1T1A, 3); // create 3 instances of S1T1A
  });
});

测试看起来很蠢,但它的主要思想是,如果不使用虚拟标志,就无法判断 afterCreate 是否被调用。它必须在测试的最开始被初始化。然后它必须在 afterCreate 中被切换,并且在测试的最后必须添加另一个 expect

测试变得难以阅读。

更好的方法是检查执行了多少个 expect

安装

npm i -D chai-assertions-count

yarn add -D chai-assertions-count

插件

像使用其他 Chai 插件一样使用这个插件。

const chai = require('chai');
const chaiAssertionsCount = require('chai-assertions-count');

chai.use(chaiAssertionsCount);

用法

const chai = require('chai');
const chaiAssertionsCount = require('chai-assertions-count');
chai.use(chaiAssertionsCount);

describe('suite #2', () => {
  beforeEach(() => {
    chai.Assertion.resetAssertsCheck();
  });
  afterEach(() => {
    // you don't need both of them
    chai.Assertion.checkAssertionsCount();
    chai.Assertion.checkExpectsCount();
  });
});

方法 resetAssertsCheck 只会删除内部计数器,并且必须在每次测试之前使用。

方法 checkExpectsCount 计算 chai.expect 被调用的次数。在您的测试使用 Expect 样式的情况下使用它。

方法 checkAssertionsCount 计算执行的断言数量。此方法与上一个方法的主要区别在于单个 expect 可能执行多个 assertion。以下示例说明了这一点

const chai = require('chai');
const chaiAssertionsCount = require('chai-assertions-count');
chai.use(chaiAssertionsCount);

describe('suite #3', () => {
  it('test #1', () => {
    chai.Assertion.expectAssertions(3);
    chai.Assertion.expectExpects(2);

    chai.expect(1).to.be.equal(1);
    chai.expect([]).to.have.property('length', 0);
  });
});

这里有两个期望,我们“期望”其中两个会被执行。同时,在“幕后”有三个断言。第一个 expect 只有一个断言。然而,第二个 expect 有两个。第一个检查属性 length 是否存在,另一个检查它的值。因此,要注意 expectAssertions 计数器。

方法 expectExpects 可以覆盖大多数情况,因此 expectAssertions 在 99.9% 的情况下不会被使用。

限制

  • 仅适用于 Expect 样式。
  • expectExpectsexpectAssertions 失败时,停止当前套件中的其他测试。