版权声明:本文为博主原创文章,未经博主允许不得转载。
chai.js 是一套TDD(测试驱动开发)/BDD(行为驱动开发)的断言库。包含有3个断言库支持BDD风格的expect/should和TDD风格的assert,这里主要说明expect/should库,BDD风格说简单的就是你的测试代码更加的语义化,让你的断言可读性更好,expect/should库都支持链式调用可以在node和浏览器环境运行,可以高效的和任何js测试框架搭配使用。
**说明:**BDD,行为驱动开发(注重测试逻辑),TDD是测试驱动开发(注重输出结果)。
本文一起具体来学习一下chai.js的BDD模块,BDD模块有两种,一种是expect,一种是sshould。二者使用相同的链式语言来组织断言,但不同在于他们初始化断言的方式:expect使用构造函数来创建断言对象实例,而should通过为Object.prototype新增方法来实现断言(所以should不支持IE),因此为了兼容IE浏览器,我们先来一起学习一下expect模块的相关api内容。
语言链修饰符是单纯作为语言链提供以期提高断言的可读性。除非被插件改写否则它们一般不提供测试功能。主要包括如下相关的修饰符:
例如:可以采用任何组合修饰符的方式来编写测试用例
expect(foo).to.is.has.which.equal('bar');
expect(goodFn).be.has.at.same.throw(Error);
说明:修饰符可以任意的增加编写,只是为了增加可读性,并未其他实质性的作用
//any:用于检测该参数是否与实际值所对应的构造函数相匹配,在keys断言之前使用any标记(与all相反)
expect(foo).to.have.any.keys('bar', 'baz')
//all:在keys断言之前使用all标记(与any相反)
expect(foo).to.have.all.keys('bar', 'baz')
// 类型断言
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(null).to.be.a('null');
expect(undefined).to.be.an('undefined');
expect(new Error).to.be.an('error');
expect(new Promise).to.be.a('promise');
expect(new Float32Array()).to.be.a('float32array');
include()和contains()即可作为属性类断言前缀语言链又可作为作为判断数组、字符串是否包含某值的断言使用。当作为语言链使用时,常用于key()断言之前
expect([1, 2, 3]).to.include(2)
expect('foobar').to.include('bar')
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo')
expect(foo).to.not.equal('bar');
expect(goodFn).to.not.throw(Error);
expect({ foo: 'baz' }).to.have.property('foo').and.not.equal('bar');
expect(foo).to.deep.equal({ bar: 'baz' });
expect({ foo: { bar: { baz: 'quux' } } }).to.have.deep.property('foo.bar.baz', 'quux');
expect('everthing').to.be.ok;
expect(1).to.be.ok;
expect(false).to.not.be.ok;
expect(true).to.be.true;
expect(1).to.not.be.true;
expect(false).to.be.false;
expect(0).to.not.be.false;
expect(null).to.be.null;
expect(undefined).not.to.be.null;
expect(undefined).to.be.undefined;
expect(null).to.not.be.undefined;
expect('foo').to.is.be.NaN;
expect(4).is.be.NaN;
expect('hi').is.be.to.exist;
expect(null).is.to.be.exist;
expect(un).is.been.exist;
expect([]).to.be.empty
expect('').to.be.empty
expect({}).to.be.empty
function(){
expect(arg).to.be.has.arguements;
}
expect('hello').to.equal('hello')
expect(42).to.equal(42)
expect({ foo: 'bar' }).to.eql({ foo: 'bar' })
expect([1, 2, 3]).to.eql([1, 2, 3])
expect(50).to.be.above(12);
expect([1, 2, 3]).to.have.length.above(2);
expect(23).to.be.least(12);
expect([1, 2, 3]).to.have.length.least(2);
expect(5).to.be.below(12);
expect([1, 2, 3]).to.have.length.below(5);
expect(5).to.be.most(12);
expect([1, 2, 3]).to.have.length.most(5);
expect('foo').to.have.length.above(2)
expect([1, 2, 3]).to.have.length.within(2, 4)
expect('foo').is.lengthOf(2)
expect([1, 2, 3]).to.has.lengthOf(2, 4)
expect(2323232).is.to.be.match(/^\d+/);
expect('foo').to.has.string('fo');
官网: http://chaijs.com/
API: http://chaijs.com/api
中文API :http://www.jianshu.com/p/f200a75a15d2
其他学习: http://blog.sina.com.cn/s/blog_62ea758a0102wyzi.html
欢迎大家相互学习交流
说明:转载请联系作者并获得作者授权,同时注明转载的地址和作者