之前开发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 参考
简书作者 小菜荔枝 转载请联系作者获得授权