Mocha是一个测试框架,为JS应用添加测试。使用见:mochajs。html
这里咱们使用自定义模块:ontstair.js,代码以下。node
//数据库连接池 var pool = require('../db.js'); //日志 var runtimeLog = require('../log.js').getLogger('runlog'); //Promise扩展库 var Promise = require('bluebird'); //私有方法 function queryPromise(queryString) { return new Promise(function(resolve, reject) { pool.getConnection(function(err, connection) { connection.query(queryString, function(err, rows, fields) { if (!err) { resolve(rows); } else { runtimeLog.error(err) reject(err) } connection.release(); }); }) }) } //导出Promise形式函数 module.exports = function() { return new Promise(function(resolve, reject) { queryPromise("select * from wb123_home_map GROUP BY onestair") .then(function(results){ resolve(results); }) .catch(function(err){ runtimeLog.error(err) }) }) }
如今让咱们使用Mocha来测试这个模块。git
rewire让咱们有能力去测试私有模块或方法。例如上面例子中的queryPromise函数,这个并无导出,借用rewire咱们就能够去测试它了。github
在测试私有方法以前,除了须要rewire,咱们还须要断言库,这里我使用的是chai,具体使用见:Chai Assertion Library。数据库
好了,如今来写测试用例。npm
//测试组 describe('onestair数据库操做测试', function() { //用例 it('queryPromise请求应该成功且返回数据', function() { rewire_onestair.__get__("queryPromise")('select * from wb123_home_map') .then(function(results) { expect(results.length).to.not.equal(0); }) .catch(function(err) { console.log(err) }) }) })
这里咱们使用rewire提供的方法rewire_onestair.__get__("queryPromise")
来获取私有方法。api
原理其实也是导出私有方法/变量,只是经过rewire来实现了,而且挂载了rewire的内部方法上。bash
执行:mocha ./test/onestair.test.js
框架
$ mocha 使用备用db配置 [2017-01-06 13:23:55.383] [INFO] runlog - onestair数据库操做测试 √ queryPromise请求应该成功且返回数据 1 passing (18ms)
OK,测试经过。异步
上面测试内部方法已经成功,如今再来测试咱们导出的模块。
测试代码以下:
//测试组 describe('onestair数据库操做测试', function() { it('导出的函数查询应该成功且返回数据', function() { onestair() .then(function(results) { expect(results.length).to.not.equal(0); }) .catch(function(err) { console.log(err) }) }) })
执行mocha ./test/onestair.test.js
$ mocha ./test/onestair.test.js 使用备用db配置 [2017-01-06 13:30:31.487] [INFO] runlog - onestair数据库操做测试 √ 导出的函数查询应该成功且返回数据 1 passing (15ms)
上面两个测试都是涉及了异步处理,可是由于我在ontstair.js
作了Promise处理,因此使得咱们知道什么时候执行回调函数。
当咱们不使用的时候,咱们就须要mocha提供done了。
见下面例子:
//测试组 describe('onestair数据库操做测试', function() { it('一个异步测试', function(done) { //设置用例超时时间 this.timeout(6000); var num = 1; setTimeout(function() { expect(num).not.to.be.NaN; //告知mocha测试结束 done(); }, 5000); }) })
结果:
$ mocha ./test/onestair.test.js 使用备用db配置 [2017-01-06 15:25:11.145] [INFO] runlog - onestair数据库操做测试 √ 一个异步测试 (5001ms) 1 passing (5s)
这就是一个典型的异步操做了。咱们经过在回调中传入done,告知异步操做什么时候结束。
这里还有个问题,那就是mocha的默认延时是2000毫秒,若是你不设置的话,上面的例子就会报错:
1) onestair数据库操做测试 一个异步测试: Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test. at null.<anonymous> (C:\Users\Administrator\AppData\Roaming\npm\node_modules\.mocha_npminstall\mocha\3.0.2\mocha\lib\runnable.js:230:19)
因此咱们须要独立设置这个用例的超时时间.this.timeout(6000)
具体使用阮老师的文章:测试框架 Mocha 实例教程里面关于mocha的使用说的很清晰。