Chai Change

Build Status

使用此 chai 断言库的插件断言您期望发生的更改。该插件在 node 和浏览器中工作,异步或同步。

该插件的理念是使您的测试更加健壮。而不是做

users.create();
expect(users.count()).to.equal(1);

而是断言该操作实际上会导致预期更改

expect(() => {
  users.create();
}).to.alter(users.count, { by: 1 });

这更加健壮,因为它避免了误报:在这个例子中,如果 users.count() 已经是 1 并且 users.create() 未实现,第一个示例仍然会通过。使用更改预期,由于从起始值没有 {by: 1} 的更改,因此测试将正确失败。

安装

Node.js

chai-change 在 npm 上可用。

  $ npm install chai-change

浏览器

通过 npm 安装,或者 下载 chai-change 并保存为 chai-change.js。然后只需在 chai.js 之后包含。

<script src="chai-change.js"></script>

插件

如果您在浏览器中使用 chai-change,您无需执行任何操作。

如果您使用 node,您只需要告诉 chai 关于该插件

const chai = require('chai');

chai.use(require('chai-change'));

预期 API

.change

断言传递给 change() 的函数返回的值在函数运行后发生更改

let x = 0;

expect(() => { x += 1; }).to.alter(() => x);
expect(() => {         }).not.to.alter(() => x);

您可以传递选项来指定您期望的更改。使用 from 键强制执行起始值,to 键用于结束值,以及 by 键用于强制执行数字更改。

expect(() => { x += 1 }).to.alter(() => x, { by: 1 });
expect(() => { x += 1 }).to.alter(() => x, { from: x });
expect(() => { x += 1 }).to.alter(() => x, { from: x, to: x + 1 });
expect(() => { x += 1 }).to.alter(() => x, { to: x + 1 });

断言 API

assert.alters

断言 changeWatcher 返回的值在 changer 函数运行后发生更改

let x = 0;
assert.alters(changer, changeWatcher);

function changer() { x += 1; }
function changeWatcher() { return x }

您可以传递选项来指定您期望的更改。使用 from 键强制执行起始值,to 键用于结束值,以及 by 键用于强制执行数字更改。

assert.alters(() => { x += 1 }, () => x, { by: 1 });
assert.alters(() => { x += 1 }, () => x, { from: x });
assert.alters(() => { x += 1 }, () => x, { from: x, to: x + 1 });
assert.alters(() => { x += 1 }, () => x, { to: x + 1 });

assert.unaltered

断言 changeWatcher 返回的值在 changer 运行后没有更改

let x = 0;
const noop = () => undefined;
assert.unaltered(noop, () => x);

异步断言

changerchangeWatcher 回调都可以返回一个 Promise,或者接受一个 node 风格的回调,其中 error 作为第一个参数。如果您提供回调,您需要为更改断言提供一个最终的 callback: 选项,用于通知您的测试运行器测试已完成。

使用 Promise

许多测试运行器——例如 mocha——支持从 it()test() 块中简单地返回 Promise 来支持异步测试。chai-change 支持这种风格。

如果您的运行器不支持返回 Promise,您可以使用 .then() 方法调用基于回调的 API 等(或者使用 callback: 就像在下面错误优先回调文档中一样)。


it("creates a user", () => {
  let count = 0;
  const User = {
    create(attrs) {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          count += 1
          resolve();
        });
      });
    },
    count() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(count);
        });
      });
    },
  };

  // when `changer` or `changeWatcher` returns a promise the expectation will return a promise as well
  return expect(() => (
    User.create({name: "bob"});
  )).to.alter(() => (
    User.count();
  ),{
    by: 1,
  });
})

使用错误优先回调

let count = 0;
const User = {
  create(attrs,cb) {
    setTimeout(() => {
      count += 1
      cb();
    });
  },
  count(cb) {
    setTimeout(() => {
      cb(null,count);
    });
  },
};

expect((stepDone) => {
  User.create({name: "bob"}, stepDone)
}).to.alter((stepDone) => {
  User.count(stepDone);
},{
  by: 1,
  callback: done
});

测试

Node: npm install && npm test

浏览器: npm install 然后打开 test/index.html

变更日志

### 2.1

Promise 支持——感谢 @talyssonoc

changeWatcherchanger 函数现在都可以返回 Promise。当与 Promise 一起使用时,期望也会返回一个 Promise,该 Promise 可以直接与 mocha 等一起使用。

2.0

  • 重大更改将整个 API 从 change 更改为 alter 以避免在 chai@2.0.0 中添加到 chai 的 .change 方法。