工作中经常需要自己写单元测试,而写单元测试除了掌握测试框架,还必须掌握断言库的用法。现就断言库chai的用法作以总结。chai有三种断言风格供我们使用,expect
,should
,assert
。本文只介绍expect
风格的断言用法。
- 综述
expect
断言的写法都是一样的。头部是expect
方法,尾部是断言方法,比如equal、a/an、ok、match
等。两者之间使用to
或to.be
连接。 - 关于类型判断
我们可以对js中各种数据类型进行判断,包括常见的数字,字符串,布尔值,对象,数组,函数及ES6新增的数据类型。
代码如下:
expect('foo').to.be.a('string');
expect(false).to.be.a('boolean');
expect(12).to.be.a('number');
expect(null).to.be.a('null');
expect(undefined).to.be.a('undefined');
expect({}).to.be.a('object');
expect([]).to.be.a('array');
expect(Math.cos).to.be.a('function');
expect(new Error).to.be.a('error');
expect(/123/).to.be.a('regexp');
- 关于严格相等
对于基本类型的数据,我们使用equal
方法来判断是否相等,对于引用类型的数据,我们有两种方法来判断是否相等。一是使用eql
来判断是否相等,二是在equal
前加上deep
即可。
代码如下:
expect(1).to.equal(1);
expect('foo').to.equal('foo');
expect(true).to.equal(true);
expect(null).to.equal(null);
expect(undefined).to.equal(undefined);
expect({a: 1}).to.eql({a: 1});
expect([1, 2]).to.eql([1, 2]);
expect([1, 2]).to.deep.equal([1, 2]);
除此之外,对于一些常见的值,有一些简写的语法。
expect(false).to.be.false;
expect(true).to.be.true;
expect(null).to.be.null;
expect(undefined).to.be.undefined;
expect(NaN).to.be.NaN;
不建议使用简写语法。
- 关于长度
代码如下:
expect([1, 2, 3]).to.have.lengthOf(3);
expect('foo').to.have.lengthOf(3);
expect([]).to.have.lengthOf(0);
expect('').to.have.lengthOf(0);
对于长度为0,我们也有简写语法,但不建议使用。
expect([]).to.be.empty;
expect('').to.be.empty;
- 关于包含
代码如下:
expect('foobar').to.include('foo');
expect([1, 2, 3]).to.include(2);
expect('foobar').to.match(/^foo/);
expect({a: 1}).to.have.property('a');
expect({a: 1, b: 2}).to.have.all.keys('a', 'b');
expect({a: 1, b: 2}).to.have.all.keys(['a', 'b']);
expect({a: 1, b: 2}).to.have.any.keys('a');
以上就是断言库
chai
的一些常用方法,还有一些其他的方法,但是官方不建议使用,掌握这些就已经足够我们写单元测试了。