使用匹配器使用不同匹配器可以测试输入输出的值是否符合预期 。下面介绍一些常见的匹配器 。普通匹配器最简单的测试值的方法就是看是否精确匹配 。首先是toBe()
test('two plus two is four', () => {expect(2 + 2).toBe(4);});
toBe用的是JAVAScript中的Object.is(),属于ES6中的特性,所以不能检测对象,如果要检测对象的值的话,需要用到toEqual 。toEquel递归检查对象或者数组中的每个字段 。
test('object assignment', () => {const data = https://www.isolves.com/it/cxkf/kj/2020-06-23/{one: 1};data['two'] = 2;expect(data).toEqual({one: 1, two: 2});});
Truthiness
在实际的测试中,我们有时候需要区分undefined、null和false 。以下的一些规则有助于我们进行 。
- toBeNull只匹配null
- toBeUndefined只匹配undefined
- toBeDefine与toBeUndefined相反
- toBeTruthy匹配任何if语句为真
- toBeFalsy匹配任何if语句为假
大多数的比较数字有等价的匹配器 。
- 大于 。toBeGreaterThan()
- 大于或者等于 。toBeGreaterThanOrEqual()
- 小于 。toBeLessThan()
- 小于或等于 。toBeLessThanOrEqual()
- toBe和toEqual同样适用于数字 注意:对比两个浮点数是否相等的时候,使用toBeCloseTo而不是toEqual
test('two plus two', () => {const value = https://www.isolves.com/it/cxkf/kj/2020-06-23/2 + 2;expect(value).toBeGreaterThan(3);expect(value).toBeGreaterThanOrEqual(3.5);expect(value).toBeLessThan(5);expect(value).toBeLessThanOrEqual(4.5);// toBe and toEqual are equivalent for numbersexpect(value).toBe(4);expect(value).toEqual(4);});
test('两个浮点数字相加', () => {const value = https://www.isolves.com/it/cxkf/kj/2020-06-23/0.1 + 0.2;//expect(value).toBe(0.3);这句会报错,因为浮点数有舍入误差expect(value).toBeCloseTo(0.3); // 这句可以运行});
如果使用toBe就会产生以下结果:文章插图
字符串
使用toMatch()测试字符串,传递的参数是正则表达式 。
test('there is no I in team', () => {expect('team').not.toMatch(/I/);});test('but there is a "stop" in Christoph', () => {expect('Christoph').toMatch(/stop/);});
【前端测试框架Jest——语法篇】数组如何检测数组中是否包含特定某一项?可以使用toContain()
const shoppingList = ['diapers','kleenex','trash bags','paper towels','beer',];test('购物清单(shopping list)里面有啤酒(beer)', () => {expect(shoppingList).toContain('beer');});
另外如果你想在测试特定函数的时候抛出一个错误,在它调用的时候可以使用toThrow 。
function compileAndroidCode() {throw new ConfigError('you are using the wrong JDK');}test('compiling android goes as expected', () => {expect(compileAndroidCode).toThrow();expect(compileAndroidCode).toThrow(ConfigError);// You can also use the exact error message or a regexpexpect(compileAndroidCode).toThrow('you are using the wrong JDK');expect(compileAndroidCode).toThrow(/JDK/);});
测试异步代码在实际开发过程中,我们经常会遇到一些异步的JavaScript代码 。当你有以异步方式运行的代码的时候,Jest需要知道当前它测试的代码是否已经完成,然后它可以转移动另一个测试 。也就是说,测试用例一定要在测试对象结束之后才能够结束为了达到这一目的,Jest有多种方法可以做到 。
回调
最常见的异步模式就是回调函数 。
注意:回调函数和异步没有必然的联系,回调只是异步的一种调用方式而已,不要将异步和回调两个概念结合起来谈
比如以下代码:
// 这里是同步执行的,完全没有异步function fun1(callback) {callback();}
现在假设一个fetchData(call)函数,获取一些数据并在完成的时候调用call(data),而我想要测试返回的数据是不是字符串'peanut butter'默认情况下,一旦到达运行上下文底部,jest测试就会立即结束 。这意味着这个测试将不能按照预期的进行 。
function fetchData(call) {setTimeout(() => {call('peanut butter1')},1000);}test('the data is peanut butter', () => {function callback(data) {expect(data).toBe('peanut butter'); // 这里没有执行到// done()}fetchData(callback);});
这样做是不会报错的,因为没有执行到我们想要测试的语句中的时候Jest测试已经结束了 。(一旦fetchData执行结束,此测试就在没有调用回调函数前结束,因为使用了setTimeout,产生了异步)
推荐阅读
- 什么是前端和后端开发?写给即将迈入前端开发领域的朋友
- 适合收藏 如何将Rasa聊天机器人框架部署到linux,简明教程
- 我再也不敢说我会写前端 Button组件「实践」
- AliOS Things内置的嵌入式GUI框架LittlevGL
- Streamlit是python的一个机器学习、数据科学、应用开发框架
- 机器学习模型的黑盒公平性测试
- 对另外网段的渗透测试
- UI 自动化测试框架设计与 PageObject 改造
- Jmeter接口测试+压力测试
- 一个软件测试员开发的IT在线工具网已上线,欢迎体验