Mocha的單元測試實戰

Mocha


Mocha是一個測試框架,爲JS應用添加測試。使用見:mochajshtml

Mocha結合Nodejs實戰


ontstair.js

這裏咱們使用自定義模塊: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

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)

mocha異步處理

上面兩個測試都是涉及了異步處理,可是由於我在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的使用說的很清晰。

相關文章
相關標籤/搜索