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:\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的单元测试实战的更多相关文章
- Karma:2. 集成 Karma 和 mocha 进行单元测试
上一篇文章讨论了如何集成 Karma 和 Jasmine,地址见:Karma:1. 集成 Karma 和 Jasmine 进行单元测试 这篇文章讨论如何 Karma 集成 mocha 测试框架. 安装 ...
- SpringBootTest单元测试实战、SpringBoot测试进阶高级篇之MockMvc讲解
1.@SpringBootTest单元测试实战 简介:讲解SpringBoot的单元测试 1.引入相关依赖 <!--springboot程序测试依赖,如果是自动创建项目默认添加--> &l ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_17、SpringBootTest单元测试实战
笔记 1.@SpringBootTest单元测试实战 简介:讲解SpringBoot的单元测试 1.引入相关依赖 <!--springboot程 ...
- 单元测试实战 - Junit测试
一.对加法函数进行测试 1.实例化被测单元(方法):类名 实例名=new 类名([参数]) 2.调用被测单元,对比预期值和输出值(实际值): 在没有junit测试工具的情况下,我们要进行如下的测试代码 ...
- 使用Junit对Spring进行单元测试实战小结
Demo代码: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath*:/ ...
- 单元测试实战 - 如何使用Eclipse
一.Eclipse工具的使用 1. 进入官网: http://www.eclipse.org ,点击download,根据系统版本选择自己需要的版本,下载之后,会得到一个zip文件,将这个文件解压到 ...
- Mockito单元测试实战
最近使用Mockito完成了几个简单的测试,写个博客mark一下: 第一种模拟web请求 @SpringBootTest @RunWith(SpringRunner.class) @WebAppCon ...
- 【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解
========================4.Springboot2.0单元测试进阶实战和自定义异常处理 ============================== 1.@SpringBoot ...
- 【node】----mocha单元测试框架-----【巷子】
1.mocha简介 单元测试是用来对一个模块.一个函数.或者一个类来进行正确性的检测工作 特点: 既可以测试简单的JavaScript函数,又可以测试异步代码, 可以 ...
随机推荐
- Spring Resources之介绍和资源接口
1.介绍 不幸的是Java的标准的java.net.URL类和针对不同的URL前缀的标准处理器都不够充分去访问所有的低级资源.例如,美誉标准化的URL实现可能用于去范围需要从classpath中或者相 ...
- LeetCode之Maximum Product Subarray
1.(原文)问题描述 Find the contiguous subarray within an array (containing at least one number) which has t ...
- Android高仿雅虎天气(两)---代码结构分析
版本已经升级到1.0.1 源码地址: GitHub:https://github.com/way1989/WayHoo OsChina:http://git.oschina.net/way/WayHo ...
- Oracle的SOME,ANY和ALL操作
平时很少用的这几个操作,今天遇到了.于是又看了一下文档. SOME和ANY一样,是比较宽松的,类似于OR.满足其中任何一个都可以. ALL要求严格一些,类似于AND,必须全部满足才可以. 不能单独使用 ...
- ASP.NET MVC IOC 之Ninject攻略
ASP.NET MVC IOC 之Ninject攻略 一.为什么要使用Ninject? 很多其它类型的IOC容器过于依赖配置文件,老是配置,总感觉有点不爽,而且要使用assembly-qualifie ...
- 分布式文件系统之MogileFS工作原理及实现过程
MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上.MogileFS由3个部分组成: 第1个部分:是server端,包 ...
- 加密算法 MD5/SHA1
近来想学习函数式编程. 但是一直不知道怎么展开这个学习过程,目前的研究进度也不深入,想讲解一些原理也无从下手. 先简单的上一些算法,逐步分析语法和思想.虽然程度不深,但至少能记录这个过程. 本例子用F ...
- ASP.NET MVC+Knockout+Web API+SignalR
架构设计(ASP.NET MVC+Knockout+Web API+SignalR) 架构设计(ASP.NET MVC+Knockout+Web API+SignalR) 2014-01-16 18: ...
- Dynamics CRM JS的调试的弊端解决办法
说道CRMJS的调试的博客,之前已经有人写过.很简单,和平常网站JS的调试过程大致相同. 但是Dynamics 中JS调试最麻烦的莫过于出错之后需要修改代码了.因为随着JS代码的修改,伴随着需要保存和 ...
- Newton迭代法-C++
牛顿迭代法: 设定x*是方程f(x)=0的根,选取x0作为x*的近似值,过点(x0, f(x0))做曲线f(x)=0的切线L,L的方程y=f(x0)+f'(x0)(x-x0),求出L与x轴焦点的横坐标 ...