Mocha的单元测试实战

2017-01-10 19:20:03来源:cnblogs.com作者:leslie·Zhao人点击

Mocha


Mocha是一个测试框架,为JS应用添加测试。使用见:mochajs。

Mocha结合Nodejs实战


ontstair.js

这里我们使用自定义模块:ontstair.js,代码如下。

//数据库链接池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来测试这个模块。

rewire

rewire让我们有能力去测试私有模块或方法。例如上面例子中的queryPromise函数,这个并没有导出,借用rewire我们就可以去测试它了。

在测试私有方法之前,除了需要rewire,我们还需要断言库,这里我使用的是chai,具体使用见:Chai Assertion Library。

好了,现在来写测试用例。

//测试组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")来获取私有方法。

原理其实也是导出私有方法/变量,只是通过rewire来实现了,并且挂载了rewire的内部方法上。

执行: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的使用说的很清晰。


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台