复制粘贴两位大佬的:
测试框架 Mocha 实例教程 【阮一峰】
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html
mocha 【廖雪峰】
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00147204317563462840426beb04a849ba813eb46bb347c000
mocha是JavaScript的一种单元测试框架,mocha主要支持的特点有:
1)既可以测试简单的JS函数,又可以测试异步代码,因为异步是JS的特性之一;
2)可以运行所有的测试,也可以运行特定的测试;
3)支持before、after、beforeEach、afterEach来编写代码。这个和Java里面的打桩(说错了勿怪)测试应该差不多。
安装mocha
$ npm install mocha -g
$ npm install chai -g
简单使用
比如我们测试一个add.js中的add函数
"use strict";
function add(a, b) {
return a + b;
}
module.exports.add = add;
通常,测试脚本与所要测试的源码脚本同名,但是后缀名为.test.js(表示测试)或者.spec.js(表示规格)。比如,add.js的测试脚本名字就是add.test.js。
所以文件夹的结构如下:
mocha-test
|------add.js
|test
|--------add.test.js
在test目录创建js文件add.test.js,编码如下:
"use strict";
var add = require("../add.js").add;
var expect = require("chai").expect;
describe("加法函数测试", function(){
it("1+1=2",function(){
expect(add(1,1)).to.be.equal(2);
});
});
Mocha默认运行test子目录里面的测试脚本。所以,一般都会把测试脚本放在test目录里面,mocha-test目录,运行下面的命令。
C:\Users\administrator\Desktop\mocha-test>mocha
加法函数测试
√ 1+1=2
1 passing (17ms)
说明:
describe块称为”测试套件”(test suite),表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称(”加法函数的测试”),第二个参数是一个实际执行的函数。
it块称为”测试用例”(test case),表示一个单独的测试,是测试的最小单位。它也是一个函数,第一个参数是测试用例的名称(”1 加 1 应该等于 2”),第二个参数是一个实际执行的函数。
异步测试
mocha默认每个测试最多2000毫秒,如果没有得到结果就报错,有时候这个时间不够,需要使用-t设置超时的门槛
如测试一个异步函数add.js中如下:
function sub(cb) {
function func() {
cb();
}
setTimeout(func, 4000);
}
module.exports.sub = sub;
测试则应该这样写:
var sub = require("../add.js").sub;
describe("减法函数测试", function(){
it("sub测试", function(done){
sub(function(){
done();
});
});
});
it块执行的时候,传入一个done参数,当测试结束的时候,必须显式调用这个函数,告诉Mocha测试结束了。否则,Mocha就无法知道,测试是否结束,会一直等到超时报错。
使用命令测试:
$ mocha -t 5000
断言库chai.expect的使用
expect(add(1,1)).to.be.equal(2);
所谓”断言”,就是判断源码的实际执行结果与预期结果是否一致,如果不一致就抛出一个错误。上面这句断言的意思是,调用add(1, 1),结果应该等于2。
基本用法:
// 相等或不相等
expect(4 + 5).to.be.equal(9);
expect(4 + 5).to.be.not.equal(10);
expect(foo).to.be.deep.equal({ bar: 'baz' });
// 布尔值为true
expect('everthing').to.be.ok;
expect(false).to.not.be.ok;
// typeof
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(foo).to.be.an.instanceof(Foo);
// include
expect([1,2,3]).to.include(2);
expect('foobar').to.contain('foo');
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');
// empty
expect([]).to.be.empty;
expect('').to.be.empty;
expect({}).to.be.empty;
// match
expect('foobar').to.match(/^foo/);
构造假数据
有时候测试时,需要构造假数据,比如构造不存在的文件,当fs.readFileSync读取时能够顺利执行完成测试。当然有时候需要为http请求等构造假数据,这个可以参考廖雪峰大佬的文章。
测试需要用到mock-fs模块,npm安装如下:
$ npm install mock-fs -g
构造文件以及文件内容,当然还可以构造文件权限等属性:
mockfs({
"文件名":"文件内容"
});
使用fs.readFileSync读取测试,看看是否构造成功:
var fs = require("fs");
var mockfs = require("mock-fs");
var expect = require("chai").expect;
function func(cb) {
setTimeout(cb, 1000);
}
describe("测试fs", function(){
describe("测试函数:readFileSync", function(){
beforeEach(function(){
mockfs({
"filename":"lend"
});
});
afterEach(function(){
//通过mock()方法可以创建多个文件的Mock并立即生效, 此后对fs的调用都会访问这些Mock文件。 调用mock.restore()可取消Mock并恢复fs。
mockfs.restore();
});
it("should all cotent.", function(done){
func(function(){
var str = fs.readFileSync("filename", "utf-8");
expect(str).to.equal("lend");
done();
});
});
it.skip("skip this test", function(){
// 此函数尚未实现时,可使用skip跳过
});
});
});
执行命令运行如下:
C:\Users\administerator\Desktop\mocha-test>mocha -t 5000
测试fs
测试函数:readFileSync
√ should all cotent. (1010ms)
- skip this test
1 passing (1s)
1 pending
参考:
https://harttle.land/2016/08/01/javascript-mock-fs.html
http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00147204317563462840426beb04a849ba813eb46bb347c000