用mocha做node.js的单元测试
js单元测试有好多个方式, 按照诞生时间依次是Qunit, jasmine, mocha, ava. 其中, ava是15年的项目, 还很新. Qunit和ava的star人数还没有超过1万, jasmine和mocha平分秋色,基本差不多. 考虑到jasmine是比mocha老的项目,而且jasmine最早是针对浏览器端的,而mocha似乎开始时就是针对node.js的, 这儿就选择mocha了.
安装使用
全局安装mocha
npm install -g mocha
项目本地安装chai(assert库)
npm install chai
chai库提供多种assert方式, 后面将举例用expect
示例被测项目, 叫add.js
function add(a, b){
return a + b
}
function minus(a,b){
return a - b
}
module.exports = add
测试代码, 叫test.js
var expect = require("chai").expect
var add = require("add")
describe("add", function(){
it("1+2=3", function(){
expect(add(1,2)).to.be.equal(3)
})
})
运行代码
mocha test.js
js经常需要对比object,一般用意是对比内容key和value是否一致,就不能用expect().to.be.equal()了,需要用
expect().to.deep.equal()
其他方面
测试private function,以及mock.
例如, 上面的minus()函数没有通过module.exports导出, 是个私有函数, 如何进行测试? 这儿需要用到rewire. 将rewire安装到项目中.
npm install rewire
测试minus的文件test2.js
var expect = require("chai").expect
var rewire = require('rewire') // 使用rewire加载被测文件.
var add = rewire("add")
describe("add", function(){
var minus = add.__get__("minus") // 使用__get__获取私有函数
it("1-2=-3", function(){
expect(minus(1,2)).to.be.equal(-1)
})
})
rewire还可以使用set来mock函数, 看这儿
关于更多chai的用法, 看这儿
最佳实践
- 装所有测试文件的目录命名为
test
,然后在目录上一级运行mocha
可以测试所有test中的文件. - 文件名为 xx.test.js或者xx_spec.js ,spec是inspect(核查)的简称.
- 使用
npm test
运行测试, 需要在package.json中加入:"scripts": { "test": "mocha" }