Node.js 使用强大的断言库 power-assert 进行
之前开发Node.js的项目时,一直都是使用
mocha测试框架结合断言库(如should.js,chai,expect.js等)进行BDD单体测试的。但是这些断言库都有很多自己的APIs方法,需要花大量的时间去学习,而且这些断言库没有详细的描述性信息,抛出的错误都是类似于这种信息:AssertionError true == false,除了这个我们不知道任何其他的信息,只能通过console.log()去查看,使用起来不是很方便。所以,今天给大家推荐一个强大的断言库power-assert,如何使用它呢?首先在您的项目工程目录下安装一些必要的包:
npm install --save-dev mocha power-assert intelli-espower-loader
安装后在你的工程目录下新建一个test文件夹并把你的测试代码放到该文件夹下(注意,如果没有指定测试路径,其默认名字必须叫test),下面是作者写的一些测试代码test/test.js,其用来验证power-assert和should.js的区别
const assert = require('power-assert');
const should = require('should'); // 别忘记 npm install should
const obj = {
arr: [1,2,3],
number: 10
};
describe('should.js和power-assert的区别', () => {
it('使用should.js的情况', () => {
should(obj.arr[0]).be.equal(obj.number); // should api
});
it('使用power-assert的情况', () => {
assert(obj.arr[0] === obj.number); // 用assert就可以
});
});
启动mocha进行测试:
node_modules/mocha/bin/mocha --require intelli-espower-loader test/test.js
运行结果
我们可以看到power-assert的强大之处,相比于should.js仅仅提供的判断性信息,power-assert则给开发者提供了尽可能多的描述性信息,而且还完全兼容Node.js内置模块Assert的全部APIs,不需要学习其他断言库的海量APIs如should.js,chai,except.js等等,它的宗旨就是No API is the best API,坚持最简单的测试形式为原则,你甚至只需要使用assert(any_expression)这一个方法即可满足你全部的测试需求,相当于没有API的概念,而且还可以自定义我们自己的APIs(customization-api),是不是很强大呢!
最后,贴上一些测试代码供读者参考,体验power-assert的强大吧!
var assert = require('power-assert');
describe('Array', function () {
beforeEach(function () {
this.ary = [1, 2, 3];
});
describe('#indexOf()', function () {
it('should return index when the value is present', function () {
var zero = 0, two = 2;
assert(this.ary.indexOf(zero) === two);
});
it('should return -1 when the value is not present', function () {
var minusOne = -1, two = 2;
assert.ok(this.ary.indexOf(two) === minusOne, 'THIS IS AN ASSERTION MESSAGE');
});
});
});
describe('various types', function () {
function Person(name, age) {
this.name = name;
this.age = age;
}
beforeEach(function () {
this.types = [
'string', 98.6, true, false, null, undefined,
['nested', 'array'],
{object: true},
NaN, Infinity,
/^not/,
new Person('alice', 3)
];
});
it('demo', function () {
var index = this.types.length - 1,
bob = new Person('bob', 5);
assert(this.types[index].name === bob.name);
});
});
ps:这里科普一下,npm中的--save与--save-dev参数的区别,--save一般规定把产品运行时(或生产环境)需要的npm包存入到package.json的dependencies中,而--save-dev则是将产品的开发环境需要的npm包存入到package.json的devDependencies中,上面提到的mocha和power-assert就属于开发环境需要的依赖(他们只负责单体测试,是独立于项目应用运行的),所以作者用了--save-dev的参数,当然这里没有硬性的规定,用哪个方案程序都可以正确运行,只是方便开发者管理而已。
power-assert 参考
Node.js Assert 参考
简书作者 小菜荔枝 转载请联系作者获得授权