Chai Change
使用此 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);
异步断言
changer
和 changeWatcher
回调都可以返回一个 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!
changeWatcher
和 changer
函数现在都可以返回 Promise。当与 Promise 一起使用时,期望也会返回一个 Promise,该 Promise 可以直接与 mocha 等一起使用。
2.0
- 重大更改将整个 API 从
change
更改为alter
以避免在chai@2.0.0
中添加到 chai 的.change
方法。