在前端开发中,测试是不可或缺的一部分。为了方便测试,Chai 是一个非常优秀的断言库。Chai 支持三种断言风格:should
,expect
和 assert
。其中,should
和 expect
是应用最广泛的。
1. expect 断言库的使用方式
在测试用例中,我们通常会使用 expect 断言库,它的使用方式很简单。我们只需要引入和安装这个库,然后就可以在测试中使用它。
安装 expect 断言库
npm install chai -D
安装成功后,我们可以使用以下方式引入 expect 断言库:
const expect = require('chai').expect;
当然,我们还可以使用 ES6 的 import 引入:
import { expect } from 'chai';
接下来,我们来介绍一下 expect 断言库的基本用法。
1.1. 相等、不相等断言
在测试中,我们通常需要判断两个值是否相等或不相等。使用 expect 断言库,我们可以使用以下语句进行判断:
expect(a).to.equal(b); expect(a).to.not.equal(b);
其中,a
和 b
都是待测试的值。如果两个值相等,第一条语句就能通过测试;如果它们不相等,第二条语句就会通过测试。我们还可以使用 deep
断言来比较对象是否相等,比如:
expect({ a: 1, b: 2 }).to.deep.equal({ b: 2, a: 1 });
上述代码中,我们并没有按照对象属性的顺序写出来,但是它们的值是相等的。
1.2. 包含、不包含断言
我们通常需要判断一个字符串或数组是否包含或不包含某个值,或者判断一个对象是否包含或不包含某个属性。在 expect 断言库中,我们可以使用以下语句:
expect(arr).to.include(val); expect(str).to.include(substring); expect(obj).to.have.property(key);
如果 arr
是一个数组且包含值为 val
的元素,上述语句第一条就能通过测试;如果 str
是一个字符串且包含子串 substring
,第二条语句就会通过测试。第三条语句则是用来判断一个对象是否包含属性 key
。
除了判断包含,我们还可以使用不包含的语句:
expect(arr).to.not.include(val); expect(str).to.not.include(substring); expect(obj).to.not.have.property(key);
1.3. 抛出、不抛出异常断言
在测试中,我们通常需要测试某个函数是否会抛出异常。在 expect 断言库中,我们可以使用以下语句进行测试:
expect(fn).to.throw();
上述语句能够通过测试的前提是,fn
必须抛出一个异常。如果 fn
没有抛出异常,上述语句就会失败。
如果我们要测试抛出的异常类型,可以使用以下语句:
expect(fn).to.throw(Error); expect(fn).to.throw(/error message/);
第一条语句用于检查是否抛出了 Error 类型的异常,第二条语句用于检查异常信息是否满足正则表达式 /error message/
。
除了测试抛出异常,我们也需要测试某个函数不抛出异常的情况。在 expect 断言库中,我们可以使用以下语句:
expect(fn).to.not.throw();
1.4. 类型断言
在测试中,我们通常需要检查一个值的类型是否正确。在 expect 断言库中,我们可以使用以下语句进行类型检查:
expect([]).to.be.an('array'); expect(123).to.be.a('number'); expect('hello').to.be.a('string');
上述语句分别检查数组、数字、字符串的类型是否正确。
1.5. 数字、布尔值、字符串相关的断言
在 expect 断言库中,还有很多数字、布尔值和字符串相关的断言,这里就不一一介绍了。
2. should 断言库的使用方式和功能
与 expect 断言库不同,should 断言库是在 Object 原型链上挂载的。当我们初始化 should 断言库时,它会在实例的原型链上挂载 should
方法,这样我们就可以使用 should
方法对值进行测试了。
安装 should 断言库
npm install chai should -D
安装成功后,我们可以使用以下方式引入 should 断言库:
const should = require('chai').should();
当然,我们还可以使用 ES6 的 import 引入:
import chai from 'chai'; const should = chai.should();
接下来,我们来介绍一下 should 断言库的基本用法。
2.1. 相等、不相等断言
在 should 断言库中,我们可以使用下面的语句进行相等和不相等的断言:
a.should.equal(b); a.should.not.equal(b);
其中,a
和 b
都是待测试的值。如果两个值相等,第一条语句就能通过测试;如果它们不相等,第二条语句就能通过测试。相比 expect 断言库,should 断言库的语法更直观,符合英语的语言习惯,更容易学习和记忆。
2.2. 包含、不包含断言
在 should 断言库中,我们可以使用以下语句进行包含和不包含的断言:
arr.should.include(val); str.should.include(substring); obj.should.have.property(key);
如果 arr
是一个数组且包含值为 val
的元素,上述语句第一条就能通过测试;如果 str
是一个字符串且包含子串 substring
,第二条语句就会通过测试。第三条语句则是用来判断一个对象是否包含属性 key
。
除了判断包含,我们还可以使用不包含的语句:
arr.should.not.include(val); str.should.not.include(substring); obj.should.not.have.property(key);
2.3. 抛出、不抛出异常断言
在 should 断言库中,我们可以使用以下语句进行抛出和不抛出异常的断言:
(fn).should.throw(); (fn).should.not.throw();
上述语句与 expect 断言库中的语句相同,不过我们使用 should
方法进行测试。如果 fn
没有抛出异常,第二条语句就会通过测试。
2.4. 类型断言
在 should 断言库中,我们可以使用以下语句进行类型检查:
([]).should.be.an('array'); (123).should.be.a('number'); ('hello').should.be.a('string');
上述语句与 expect 断言库中的语句相同,不过我们使用 should
方法进行测试。
2.5. 数字、布尔值、字符串相关的断言
在 should 断言库中,还有很多数字、布尔值和字符串相关的断言,这里就不一一介绍了。
3. 总结
无论是 expect 还是 should 断言库,都是非常优秀的断言库,使用它们可以让我们的测试更加简单、直观。相比于 expect 断言库,should 断言库的语法更直观,适合初学者学习和使用。对于熟悉 expect 断言库的人来说,也可以通过比较它们之间的语法区别,了解其内部实现机制,从而更好地学习和使用这两个库。
示例代码:
// javascriptcn.com 代码示例 const should = require('chai').should(); const expect = require('chai').expect; describe('chai demo', () => { it('expect demo', () => { expect(1 + 2).to.be.equal(3); expect('hello').to.include('ll'); expect([1, 2, 3]).to.include(2); expect(() => { throw new Error('oops'); }).to.throw(); expect({ name: 'Tom', age: 18, }).to.have.property('name', 'Tom'); }); it('should demo', () => { (1 + 2).should.be.equal(3); 'hello'.should.include('ll'); [1, 2, 3].should.include(2); (() => { throw new Error('oops'); }).should.throw(); ({ name: 'Tom', age: 18, }).should.have.property('name', 'Tom'); }); });
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6527c1c87d4982a6eba56a3e