# nodejs的单元测试框架mocha
当我们编写比较复杂的项目时,需要对项目的测试用例进行长期跟踪,对单元模块进行质量控制,对开发成果进行自我检验,那么需要一个好用的工具,自学了一下mocha,这个笔记几乎是照搬官网的英文版进行了自我的一番理解的初步呈现,多以条目为主,还没有时间进一步实践,通过强制写笔记的方式,鞭策自己加深理解,学会分享,提高学习力,我在努力。
## 1.安装
```
npm install --global mocha
```
## 2.作为项目开发依赖项安装
npm install --save-dev mocha
## 3.版本注意事项
Mocha v3.0.0 需要npm v2.14.2+
v3.0.0之后,不再依赖字符串匹配来决定执行哪些测试。
.only()可以多次使用来定义要运行的测试子集。
## 4.编码
可以支持before, after, beforeEach, afterEach
## 5.test目录
mocha会运行test目录下所有测试,目录名不能修改。
如果要包含子目录用--recursive
## 6.生成package.json依赖mocha
使用npm init命令生成package.json
## 7.每个测试一段
it("name", function(){…})
## 8.测试原则
一次只测一种情况,测试代码要非常简单cd mocha
## 9.启动命令
* (1).node_modules/mocha/bin/mocha
* (2)先package.json加script{"test":"mocha"},再npm test
## 10.配置debug命令
## 11.段落代码说明
### 特定执行
```
describe.only("#indexOf()", function(){});
```
### 跳过
```
descrip.skip("#indexOf()", function(){});
```
### 跳过多个测试
```
before(function(){
if(/* check test environment */) {
//setup code
} else {
this.skip();
}
});
```
### Diff视图
err.actual err.expected 断言成功失败视图
### require导包
```
var testCase = require('mocha').describe;//可以用更直观的变量名称
```
### 重试测试
```
当调用this.retries(x)时,会重新调用beforeEach及afterEach方法
```
### 动态生成测试
### 定义慢的方法
```
this.slow(10000);
```
### 定义超时的方法
```
this.timeout(500);
```
### 代码级别分为
```
套件级
describe片段
测试级
it片段
钩子级
beforeEach中
```
## 12.mocha的测试接口
BDD,TDD,Exports,QUnit,Require
BDD接口比较常用,之前的例子都是BDD。
TDD接口是类似JUnit的调用方式。
QUNIT扁平化的样子类似于TDD,但也支持before,after,beforeEach,afterEach
## 13.测试工具
Wallaby.js
mocha摩卡侧边栏
## 14.测试报告
spec报告器:可以输出嵌套的分层视图
点阵报告器:是最小化的输出,可以用一系列字符代表测试用例,失败是红色叹号,待定是蓝色逗号,慢速是×××显示
NYAN报告器:有一只猫做进度条,这个莫名其妙
TAP报告器:显示每行单元测试明细
LANDING STRIP 报告器:飞机降落的跑道
LIST报告器:明细列表
PROGRESS进展报告器:进度条
MIN报告器:仅显示摘要
DOC报告器:以html格式正文输出
* (1) 安装报告器
```
mocha.setup({
ui:'tdd',
ignoreLeaks: true,
asyncOnly: true
});
```
* (2) 参数指定报告器
```
mocha --reporter list --growl
```
* (3) 变量定义报告器
```
$REPORTER=nyan npm test
```
多次调用回调会抛错
## 15.require('chai')是一个断言库
var should = require('chai').should();
这个可以判断should.exist(bitcore.lib);这些内容是否存在
### 语言链
```
to
be
been
```
### sinon可以创建假服务器
let server = sinon.fakeServer.create();
### sinon提供spy和Stub配合断言框架chai
模拟返回值:sinon.fake.returns(42);
模拟ajax:sinon.replace(jQuery, 'ajax', sinon.fake());
模拟xhr:sinon.useFakeXMLHttpRequest();
模拟服务器:sinon.fakeServer.create()
### proxyquire覆盖依赖性(依赖注入?)
### 模拟database
sinon.mock(database);
## 16.spies、stub与mock区别
stub拥有spies的所有功能,不是为了监视调用情况,而是完全取代。
mock与stub功能一样,都是用来替换指定函数,mock用在替换掉多个方法,stub适用于替换一个函数。