NodeJS测试框架mocha入门教程
发布时间 - 2026-01-11 00:24:29 点击率:次NodeJS里最常用的测试框架估计就是mocha了。它支持多种node的assert libs, 同时支持异步和同步的测试,同时支持多种方式导出结果,也支持直接在browser上跑Javascript代码测试。

本文示例大多源于官网示例,部分示例结合需要或自己的感想有所改动。更多介绍请看 官方网址:Mocha on Github
Installation:
当你成功安装nodejs v0.10 和 npm后执行下面这条命令。
# npm install -g mocha
p.s. Ubuntu的注意apt源里的nodejs版本会比较旧,某些module会不支持,请从nodejs官网进行源码安装。
First step to Mocha:
以下为最简单的一个mocha示例:
var assert = require("assert");
describe('Array', function(){
describe('#indexOf()', function(){
it('should return -1 when the value is not present', function(){
assert.equal(-1, [1,2,3].indexOf(5));
assert.equal(-1, [1,2,3].indexOf(0));
})
})
});
describe (moduleName, testDetails) 由上述代码可看出,describe是可以嵌套的,比如上述代码嵌套的两个describe就可以理解成测试人员希望测试Array模块下的#indexOf() 子模块。module_name 是可以随便取的,关键是要让人读明白就好。
it (info, function) 具体的测试语句会放在it的回调函数里,一般来说info字符串会写期望的正确输出的简要一句话文字说明。当该it block内的test failed的时候控制台就会把详细信息打印出来。一般是从最外层的describe的module_name开始输出(可以理解成沿着路径或者递归链或者回调链),最后输出info,表示该期望的info内容没有被满足。一个it对应一个实际的test case
assert.equal (exp1, exp2) 断言判断exp1结果是否等于exp2, 这里采取的等于判断是== 而并非 === 。即 assert.equal(1, ‘1') 认为是True。这只是nodejs里的assert.js的一种断言形式,下文会提到同样比较常用的should.js。
如果exp1和exp2均为字符串,字符串比较出错时则控制台会用颜色把相异的部分标出来。
Asynchronous
Frist step 中的代码显然是个 Synchronous 的代码,那么对于异步代码应该怎么做呢?很简单,在你最深处的回调函数中加done()表示结束。
fs = require('fs');
describe('File', function(){
describe('#readFile()', function(){
it('should read test.ls without error', function(done){
fs.readFile('test.ls', function(err){
if (err) throw err;
done();
});
})
})
})
done ()<br> 按照瀑布流编程习惯,取名done是表示你回调的最深处,也就是结束写嵌套回调函数。但对于回调链来说done实际上意味着告诉mocha从此处开始测试,一层层回调回去。
上例代码是test pass的,我们尝试把test.ls改成不存在的test.as。便会返回具体的错误位置。
这里可能会有个疑问,假如我有两个异步函数(两条分叉的回调链),那我应该在哪里加done()呢?实际上这个时候就不应该在一个it里面存在两个要测试的函数,事实上一个it里面只能调用一次done,当你调用多次done的话mocha会抛出错误。所以应该类似这样:
fs = require('fs');
describe('File', function(){
describe('#readFile()', function(){
it('should read test.ls without error', function(done){
fs.readFile('test.ls', function(err){
if (err) throw err;
done();
});
})
it('should read test.js without error', function(done){
fs.readFile('test.js', function(err){
if (err) throw err;
done();
});
})
})
})
Pending
即省去测试细节只保留函数体。一般适用情况比如负责测试框架的写好框架让组员去实现细节,或者测试细节尚未完全正确实现先注释以免影响全局测试情况。这种时候mocha会默认该测试pass。
作用有点像Python的pass。
describe('Array', function(){
describe('#indexOf()', function(){
it('should return -1 when the value is not present', function(){
})
})
});
Exclusive && Inclusive
其实很好理解,分别对应only和skip函数。
fs = require('fs');
describe('File', function(){
describe('#readFile()', function(){
it.skip('should read test.ls without error', function(done){
fs.readFile('test.ls', function(err){
if (err) throw err;
done();
});
})
it('should read test.js without error', function(done){
})
})
})
上面的代码只会有一个test complete, 只有only的会被执行,另一个会被忽略掉。每个函数里只能有一个only。如果是it.skip ,那么该case就会被忽略。
only和skip共用没有什么实际意义,因为only的作用会把skip屏蔽掉。
fs = require('fs');
describe('File', function(){
describe('#readFile()', function(){
it.skip('should read test.ls without error', function(done){
fs.readFile('test.as', function(err){
if (err) throw err;
done();
});
})
it('should read test.js without error', function(done){
})
})
})
上面的代码尽管test.as不存在,但是由于skip,依然会显示test complete。
Before && After
单元测试里经常会用到before和after。mocha同时还提供了beforeEach()和afterEach()。
这里为方便阅读用livescript表示,!->可理解成function(){}。细节无需细读,只需通过框架了解这几个函数如何使用便可。
require! assert require! fs can = it describe 'Array', !-> beforeEach !-> console.log 'beforeEach Array' before !-> console.log 'before Array' before !-> console.log 'before Array second time' after !-> console.log 'after Array' describe '#indexOf()', !-> can 'should return -1 when the value is not present', !-> assert.equal -1, [1,2,3].indexOf 0 can 'should return 1 when the value is not present', !-> describe 'File', !-> beforeEach !-> console.log 'beforeEach file test!' afterEach !-> console.log 'afterEach File test!' describe '#readFile()', !-> can 'should read test.ls without error', !(done)-> fs.readFile 'test.ls', !(err)-> if err throw err done! can 'should read test.js without error', !(done)-> fs.readFile 'test.js', !(err)-> if err throw err done!
由结果可知(after的使用与before同理),
beforeEach会对当前describe下的所有子case生效。
before和after的代码没有特殊顺序要求。
同一个describe下可以有多个before,执行顺序与代码顺序相同。
同一个describe下的执行顺序为before, beforeEach, afterEach, after
当一个it有多个before的时候,执行顺序从最外围的describe的before开始,其余同理。
Test Driven Develop (TDD)
mocha默认的模式是Behavior Driven Develop (BDD),要想执行TDD的test的时候需要加上参数,如
mocha -u tdd test.js
前文所讲的describe, it, before, after等都属于BDD的范畴,对于TDD,我们用suite, test, setup, teardown。样例代码如下:
suite 'Array', !-> setup !-> console.log 'setup' teardown !-> console.log 'teardown' suite '#indexOf()', !-> test 'should return -1 when not present', !-> assert.equal -1, [1,2,3].indexOf 4
# mocha测试框架
# mocha框架
# 测试框架mocha
# 怎么用
# nodejs入门教程五:连接数据库的方法分析
# nodejs入门教程四:URL相关模块用法分析
# nodejs入门教程三:调用内部和外部方法示例
# nodejs入门教程二:创建一个简单应用示例
# nodejs入门教程一:概念与用法简介
# Nodejs极简入门教程(三):进程
# Nodejs极简入门教程(二):定时器
# Nodejs极简入门教程(一):模块机制
# nodejs教程 安装express及配置app.js文件的详细步骤
# NodeJS框架Express的模板视图机制分析
# Nodejs的express使用教程
# nodejs入门教程六:express模块用法示例
# 回调
# 多个
# 当你
# 不存在
# 会把
# 相异
# 递归
# 官网
# 最深处
# 有一个
# 自己的
# 就会
# 是个
# 很好
# 放在
# 有个
# 我有
# 就不
# 就好
# 只需
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
高端智能建站公司优选:品牌定制与SEO优化一站式服务
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
如何快速生成可下载的建站源码工具?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Laravel如何创建自定义Artisan命令?(代码示例)
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
javascript如何操作浏览器历史记录_怎样实现无刷新导航
MySQL查询结果复制到新表的方法(更新、插入)
Laravel如何实现模型的全局作用域?(Global Scope示例)
如何在景安服务器上快速搭建个人网站?
JS中对数组元素进行增删改移的方法总结
移动端脚本框架Hammer.js
JavaScript实现Fly Bird小游戏
如何在阿里云购买域名并搭建网站?
详解jQuery中的事件
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Laravel如何使用Eloquent进行子查询
网站制作软件有哪些,制图软件有哪些?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
linux写shell需要注意的问题(必看)
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
如何用PHP快速搭建CMS系统?
JS去除重复并统计数量的实现方法
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel如何使用Blade模板引擎?(完整语法和示例)
JavaScript Ajax实现异步通信
如何在 Pandas 中基于一列条件计算另一列的分组均值
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
如何在IIS中新建站点并解决端口绑定冲突?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
如何用好域名打造高点击率的自主建站?
Laravel怎么判断请求类型_Laravel Request isMethod用法
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何在局域网内绑定自建网站域名?
iOS中将个别页面强制横屏其他页面竖屏
网站制作壁纸教程视频,电脑壁纸网站?
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何在阿里云虚拟服务器快速搭建网站?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】

