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的使用說的很清晰。