zoukankan      html  css  js  c++  java
  • Mocha的单元测试实战

    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:UsersAdministratorAppDataRoaming
    pm
    ode_modules.mocha_npminstallmocha3.0.2mochalib
    unnable.js:230:19)
    

    所以我们需要独立设置这个用例的超时时间.this.timeout(6000)

    拓展


    具体使用阮老师的文章:测试框架 Mocha 实例教程里面关于mocha的使用说的很清晰。

  • 相关阅读:
    这是个神奇的博客
    Tomcat Access Log 的格式
    CA证书
    记一次性能调优
    web系统能力培养计划
    金融知识学习
    读《华为区块链白皮书》
    马未都说收藏:陶瓷篇(8、9)元青花、永宣青花
    阿里历年面试试题
    回车(CR)换行(LF)的来历及区别
  • 原文地址:https://www.cnblogs.com/zqzjs/p/6255849.html
Copyright © 2011-2022 走看看