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

Mocha的单元测试实战的更多相关文章

  1. Karma:2. 集成 Karma 和 mocha 进行单元测试

    上一篇文章讨论了如何集成 Karma 和 Jasmine,地址见:Karma:1. 集成 Karma 和 Jasmine 进行单元测试 这篇文章讨论如何 Karma 集成 mocha 测试框架. 安装 ...

  2. SpringBootTest单元测试实战、SpringBoot测试进阶高级篇之MockMvc讲解

    1.@SpringBootTest单元测试实战 简介:讲解SpringBoot的单元测试 1.引入相关依赖 <!--springboot程序测试依赖,如果是自动创建项目默认添加--> &l ...

  3. 小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_17、SpringBootTest单元测试实战

    笔记 1.@SpringBootTest单元测试实战     简介:讲解SpringBoot的单元测试         1.引入相关依赖              <!--springboot程 ...

  4. 单元测试实战 - Junit测试

    一.对加法函数进行测试 1.实例化被测单元(方法):类名 实例名=new 类名([参数]) 2.调用被测单元,对比预期值和输出值(实际值): 在没有junit测试工具的情况下,我们要进行如下的测试代码 ...

  5. 使用Junit对Spring进行单元测试实战小结

    Demo代码: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath*:/ ...

  6. 单元测试实战 - 如何使用Eclipse

    一.Eclipse工具的使用 1. 进入官网: http://www.eclipse.org  ,点击download,根据系统版本选择自己需要的版本,下载之后,会得到一个zip文件,将这个文件解压到 ...

  7. Mockito单元测试实战

    最近使用Mockito完成了几个简单的测试,写个博客mark一下: 第一种模拟web请求 @SpringBootTest @RunWith(SpringRunner.class) @WebAppCon ...

  8. 【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解

    ========================4.Springboot2.0单元测试进阶实战和自定义异常处理 ============================== 1.@SpringBoot ...

  9. 【node】----mocha单元测试框架-----【巷子】

    1.mocha简介 单元测试是用来对一个模块.一个函数.或者一个类来进行正确性的检测工作   特点:      既可以测试简单的JavaScript函数,又可以测试异步代码,           可以 ...

随机推荐

  1. leetcode第17题--4Sum

    Problem:Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + ...

  2. INNO SETUP数据库的连接与创建

    原文:INNO SETUP数据库的连接与创建 说明一下:这块程序的前半部分在INNO SETUP的实例里面就有,而后面如果对数据库进行备份和还原在实例里面没有,在网上也不好找,是本人费了好大劲一句一句 ...

  3. 我的CSS 入门1

    CSS(Cascading Style Sheets)级联样式表.我现在所知的,她的存在能够更好的管理多个HTML文件,或者是为了使得网页设计更为丰富多彩,“简单可依赖”. 如果你对HTML一无所知, ...

  4. 【转】仿QQ5.0侧滑菜单ResideMenu

    本文由孙国威 原创.如需转载,请注明出处! 原文:http://blog.csdn.net/manoel/article/details/39013095 为了后续对这个项目进行优化,比如透明度动画. ...

  5. requirejs的config及optimizer r.js配置

    1.怎么处理require.js这些不需要被合并的东西 所有appDir中的文件都会先copy到dir文件中,进行压缩,然后根据build.js中的配置进行相应的合并,包括img等:2.样式合并后原来 ...

  6. C#动态表达式计算(续2)

    上两篇废话太多,这一次我就不多说了,由于代码比较简单,可以直接从https://github.com/scottshare/DynamicExpress.git地址下载. 以下说明一下使用方法: Dy ...

  7. .Net组件程序设计

    .Net组件程序设计之上下文 在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?没错了,就是上下文.CLR把应用程序域更细化了,在应用程 ...

  8. 【转】jQuery each函数中的continue及break

    continue :return true; break :return false; 也可以利用return即可跳出jQuery 来源:http://bie.xiaowangge.info/brow ...

  9. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 三

    本次改动的主要内容是实现MongoDB.Repository在MongoDB中建立索引. 建立索引主要使用MongoDB的官方驱动中EnsureIndex方法. 在MongoDB.Repository ...

  10. TFS二次开发、C#知识点、SQL知识

    TFS二次开发.C#知识点.SQL知识总结目录   TFS二次开发系列 TFS二次开发系列:一.TFS体系结构和概念 TFS二次开发系列:二.TFS的安装 TFS二次开发系列:三.TFS二次开发的第一 ...