mocha的基本介绍expect风格断⾔库的基本语法
mocha 介绍
mocha 是⼀个功能丰富的javascript测试框架,可以运⾏在nodejs和浏览器环境,能够使异步测试变得简单有趣。mocha 串联运⾏测试,允许灵活和精确地报告结果,同时映射未捕获的异常⽤来纠正测试⽤例。 mocha ⽀持TDD/BDD 的 开发⽅式,结合
should.js/expect/chai/better-asrt 断⾔库,能轻松构建各种风格的测试⽤例。
BDD,即⾏为驱动开发。不对代码的实现细节编写测试,⽽针对⾏为编写测试,下⽂的测试⽤例风格基本上都遵循BDD格式
mocha 安装
全局安装
npm install mocha -g
复制代码
作为开发依赖安装在项⽬中:
npm install mocha --save-dev
复制代码
安装Mocha v3.0.0或者更新的版本,你需要v1.4.0或者更新版本的npm。此外,运⾏Mocha的Node版本不能低于v0.10
mocha 基本使⽤
安装了项⽬依赖后,请在根⽬录下创建⼀个/test的空⽂件夹。默认情况下,在命令⾏中执⾏mocha命令,mocha会⾃动运⾏/test⼀级⽬录下的测试脚本。
下⾯在test⽬录下创建⼀个test_mocha.js
//模块依赖
var expect = require('chai').expect;
//断⾔条件
describe('Array', function(){
describe('#indexOf()', function(){
it('should return -1 if value not exits', function(){
expect([1,2,3].indexOf(5)).to.be.equal(-1)
});
});
});
复制代码
保存⽂件,执⾏命令
mocha
复制代码
可以很清晰的看到,在9ms内通过了⼀个测试⽤例。测试⽤例中可以看到描述的信息
注意1:如果想递归的运⾏test⽬录的所有⼦⽬录,则需要带上参数
mocha --recursive
复制代码
如果想指定⽬录运⾏测试脚本,请在mocha命令后⾯紧跟测试脚本的路径和⽂件名
mocha test/filename1.js
复制代码
注意2:也可以使⽤通配符来匹配测试脚本时
mocha test/unit/{filename1,filename2}.js
mocha test/unit/*.js
复制代码weakest
个性化
直接使⽤mocha运⾏测试⽤例⽂件是可以的,但是并不能体现出mocha的丰富多彩的功能。下⾯通过⼀些⽐较常⽤的案例,为⼤家展⽰⼀下mocha的强⼤功能。
使⽤ mochawesome来制作漂亮的HTTP格式报告
执⾏下⾯的代码会在当前⽬录的mochawesome-reports⼦⽬录内⽣成对应⽂件
npm install --save-dev mochawesome
mocha --reporter mochawesome
复制代码
监听⽂件
⼀旦/test/⽬录下测试脚本被修改(并保存)之后,会⾃动执⾏mocha
mocha --watch
复制代码
错误终⽌
参数指定只要有⼀个测试⽤例没有通过,就停⽌执⾏后⾯的测试⽤例
mocha --bail
复制代码
检索测试⽤例名字
检索测试⽤例的名称(即it块的第⼀个参数),
mocha --grep "产品" #只执⾏匹配的测试⽤例
mocha --grep "产品" --invert #只运⾏不匹配的测试⽤例
复制代码
使⽤配置⽂件 mocha.opts
mocha允许在test⽬录下⾯,放置配置⽂件mocha.opts,把命令⾏参数写在⾥⾯,统⼀执⾏
在线翻译韩语mocha --recursive --reporter tap --growl
复制代码
上⾯三个参数,可以写进 test⽬录下的mocha.opts⽂件
--reporter tap
杭州外教--recursive
--growl
复制代码
然后执⾏ mocha 命令就能取得与上⾯⼀样的运⾏结果
mocha
复制代码
如果测试⽤例不是存放在test⼦⽬录,可以在mocha.opts写⼊以下内容
rver-tests
--recursive
复制代码
上⾯代码指定运⾏rver-tests⽬录及其⼦⽬录之中的测试脚本
帮助
mocha --help
mocha -h
复制代码
断⾔库的使⽤
Mocha允许你使⽤你喜欢的断⾔库
- BDD风格贯穿始终
-
expect() 风格的断⾔
- expect()、asrt()和 should风格的断⾔
- C风格的⾃⽂档化的asrt()
- “可扩展的BDD断⾔⼯具”
简单介绍⼀下expect断⾔库的使⽤
⼀般在测试⽤例⽂件的顶部,声明引⽤的断⾔库
chopping
var expect = require('chai').expect;
复制代码
上⾯这⾏代码引⼊的断⾔库是chai,并且制定使⽤它的expect断⾔风格。
基本上,expect断⾔的写法都是⼀样的。头部是expect⽅法,尾部是断⾔⽅法,⽐如equal、a/an、ok、match等。两者之间使⽤to或to.be连接。
// equal 相等或不相等
// equal 相等或不相等
expect(4 + 5).to.be.equal(9);
expect(4 + 5).qual(10);
expect('hello').to.equal('hello');
expect(42).to.equal(42);
expect(1).to.not.equal(true);
expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' });
expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });
// above 断⾔⽬标的值⼤于某个value,如果前⾯有length的链式标记,则可以⽤来判断数组长度或者字符串长度expect(10).to.be.above(5);
expect('foo').to.have.length.above(2);
expect([ 1, 2, 3 ]).to.have.length.above(2);
类似的还有least(value)表⽰⼤于等于;below(value)表⽰⼩于;most(value)表⽰⼩于等于
// 判断⽬标是否为布尔值true(隐式转换)
expect('everthing').to.be.ok;
expect(1).to.be.ok;
expect(fal).to.not.be.ok;
expect(undefined).to.not.be.ok;
expect(null).to.not.be.ok;
// true/fal 断⾔⽬标是否为true或fal
expect(true).ue;
expect(1).to.ue;
expect(fal).to.be.fal;
expect(0).to.not.be.fal;
// null/undefined 断⾔⽬标是否为null/undefined
expect(null).to.be.null;
expect(undefined).be.null;
expect(undefined).to.be.undefined;
expect(null).to.not.be.undefined;
// NaN 断⾔⽬标值不是数值
expect('foo').to.be.NaN;
expect(4).be.NaN;
// 判断类型⼤法(可以实现上⾯的⼀些例⼦):a/an
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
wolonggangexpect(foo).to.be.an.instanceof(Foo);
expect(null).to.be.a('null');
expect(undefined).to.be.an('undefined');
expect(new Error).to.be.an('error');
expect(new Promi).to.be.a('promi');
// 包含关系:⽤来断⾔字符串包含和数组包含。如果⽤在链式调⽤中,可以⽤来测试对象是否包含某key 可以混着⽤。expect([1,2,3]).to.include(2);
expect('foobar').to.contain('foo');
expect({ foo: 'bar', hello: 'univer' }).to.include.keys('foo');
// 判断空值
expect([]).pty;
眼霜的使用方法
expect('').pty;cele>skillfully
expect({}).pty;
// match
expect('foobar').to.match(/^foo/);
zero plus// exist 断⾔⽬标既不是null也不是undefined
var foo = 'hi' , bar = null, baz;
expect(foo).to.exist;
expect(bar).ist;
expect(baz).ist;
expect(baz).ist;
// within断⾔⽬标值在某个区间范围内,可以与length连⽤
expect(7).to.be.within(5,10);
expect('foo').to.have.length.within(2,4);
expect([ 1, 2, 3 ]).to.have.length.within(2,4);
// instanceOf 断⾔⽬标是某个构造器产⽣的事例
var Tea = function (name) { this.name = name; } , Chai = new Tea('chai');
expect(Chai).to.be.an.instanceof(Tea);
expect([ 1, 2, 3 ]).to.be.instanceof(Array);
// property(name, [value]) 断⾔⽬标有以name为key的属性,并且可以指定value断⾔属性值是严格相等的,此[value]参数为可选,如果使⽤deep链式调⽤,可以在name中// simple referencing
var obj = { foo: 'bar' };
expect(obj).to.have.property('foo');
expect(obj).to.have.property('foo', 'bar');// 类似于expect(obj).to.contains.keys('foo')
// deep referencing
var deepObj = {
green: { tea: 'matcha' },
teas: [ 'chai', 'matcha', { tea: 'konacha' } ]
};
expect(deepObj).to.have.deep.property('a', 'matcha');
expect(deepObj).to.have.deep.property('teas[1]', 'matcha');
expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha');
// ownproperty 断⾔⽬标拥有⾃⼰的属性,⾮原型链继承
expect('test').to.have.ownProperty('length');
// throw 断⾔⽬标抛出特定的异常
var err = new ReferenceError('This is a bad function.');
var fn = function () { throw err; }
expect(fn).to.throw(ReferenceError);
expect(fn).to.throw(Error);
expect(fn).to.throw(/bad function/);
expect(fn).to.not.throw('good function');
collecting
expect(fn).to.throw(ReferenceError, /bad function/);
expect(fn).to.throw(err);
expect(fn).to.not.throw(new RangeError('Out of range.'));
// satisfy(method) 断⾔⽬标通过⼀个真值测试
expect(1).to.satisfy(function(num) { return num > 0; })
复制代码
BDD 风格的 hock⽅法
Mocha默认使⽤“BDD”风格的接⼝,提供测试⽤例的四个钩⼦:before()、after()、beforeEach()和afterEach(),这些函数可以⽤来
(在测试前)做预处理⼯作或在测试后清理⼯作。