从 chai-things 到 mocha 插件复习 Chai 的高级用法
在前端开发中,测试是非常重要的一环,而 Chai 便是其中一款常用的测试库。除了基本的语法外,Chai 还有许多高级用法,本文就以 chai-things 和 mocha 插件为例,来回顾 Chai 的高级用法。
chai-things
chai-things 是 Chai 的一个插件,主要用于对数组和对象中的元素进行断言。下面我们来看一个例子:
const { expect } = require('chai');
const fruits = ['apple', 'orange', 'banana'];
expect(fruits).to.include('apple');
expect(fruits).to.not.include('grape');
expect(fruits).all.have.lengthOf(6); // should fail
expect(fruits).all.have.lengthOf(5); // should pass
expect(fruits).to.be.an('array').that.includes('apple');可以看到,chai-things 提供了一些新的链式语法来断言数组中的元素。其中,include 和 not.include 分别用于判断数组中是否包含某个元素,all.have.lengthOf 判断所有元素的长度是否一致,be.an('array').that.includes 判断是否为数组且包含某个元素。
chai-things 还可以用于断言对象中的属性:
const { expect } = require('chai');
const person = { name: 'Alice', age: 20 };
expect(person).to.have.property('name').that.contains('li');
expect(person).to.have.property('age').that.is.above(18);
expect(person).to.have.any.keys('gender', 'age');
expect(person).to.have.all.keys('name', 'age');我们可以使用 have.property 来断言对象中是否存在某个属性,然后再使用 that.contains 来判断属性中是否包含某个字符串。is.above 判断是否大于 18,have.any.keys 判断是否拥有任一一个指定的属性,而 have.all.keys 则判断是否所有的属性都存在。
mocha 插件
接下来我们聊聊如何通过 mocha 插件来拓展 Chai 的用法。
在我们的测试用例中,有时会需要同时进行多个断言并且每个断言都会对后面的操作有影响。随着断言的增多,代码的可读性也会变得越来越差,这时候我们可以使用 chai-spies 来简化代码:
const foo = { bar: () => {} }
chai.spy.on(foo, 'bar');
expect(foo.bar).to.have.been.called.once;
expect(foo.bar).to.have.been.called.with('baz');
expect(foo.bar).to.have.been.called.exactly(3);
expect(foo.bar).to.have.been.called.at.least(3);使用 chai-spies,我们可以很简单地对被测函数进行监视,然后在需要的时候进行断言。这里的 once 表示被测函数只被调用了一次,with 表示被测函数的参数等于某个值,exactly 表示被测函数恰好被调用了几次,而 at.least 则表示被测函数被调用的次数至少为某个值。
除了 chai-spies,还有许多其他的 mocha 插件可以用来拓展 Chai 的功能,如 chai-jquery 用于测试 jQuery 代码,chai-http 用于测试后端接口等等。
总结
我们回顾了 chai-things 的用法和 mocha 插件的使用,并在实际的例子中展示了它们的应用。总体而言,使用这些插件可以让我们更容易地编写和维护测试用例,从而保证代码的质量和稳定性。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/648bf9f648841e9894a437f3