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. js实现文字横向滚动

    页面布局      <div id="scroll_div" class="fl">         <div id="scroll ...

  2. .NET简单企业应用

    <.NET简单企业应用>项目开发环境 项目开始,开发团队需要构建一套开发环境,主要包含:开发工具.代码管理/版本控制系统.任务和Bug管理系统和持续集成(CI)系统.本文主要列举项目开发中 ...

  3. 无法识别的配置节 applicationSettings

    在.NETFramework2.0中,如果发布的虚拟目录程序引用了外部的webservice访问接口,配置文件会出现下边的applicationSettings节点,如 但是访问应用程序时候,可能会出 ...

  4. 大数据工具篇之Hive与HBase整合完整教程

    大数据工具篇之Hive与HBase整合完整教程 一.引言 最近的一次培训,用户特意提到Hadoop环境下HDFS中存储的文件如何才能导入到HBase,关于这部分基于HBase Java API的写入方 ...

  5. Codekart 框架

    [Node.js框架] 为什么要开发 Codekart 框架 两年前,在被php的$符号和字符串处理折磨得半夜骂娘之后,我义无反顾地决定:珍爱生命,远离php. 之后一直在寻找一门“完美的语言”,先后 ...

  6. PHP GD 库 缩略图 添加水印

    class cls_image { var $error_no = 0; var $error_msg = ''; //var $images_dir = IMAGE_DIR; //var $data ...

  7. [RM 状态机详解1] RMApp状态机详解

    概述 Apache Hadoop 2.0在Hadoop 1.0基础上做了许多的重构工作,代码上的重构最大的变化在于引入状态机处理各个角色的状态与变迁,使用状态机是得代码结构更加清晰,方便异步处理各种操 ...

  8. web前端学习笔记

    web前端学习笔记(CSS盒子的定位) 相对定位 使用相对定位的盒子的位置常以标准流的排版方式为基础,然后使盒子相对于它在原本的标准位置偏移指定的距离.相对定位的盒子仍在标准流中,它后面的盒子仍以标准 ...

  9. UITableView的style详解

    在默认的UITableViewCell中,主要有三个系统控件,分别是两个Lable和一个imageView,两个Label,imageView(始终在最左边)的布局位置可以通过下面4个设置: UITa ...

  10. JS事件冒泡、停止冒泡、addEventListener--实例演示

    问题: <div class='item' id='outer' onclick="alert('outer')"> <div class='item' id=' ...