Jest测试框架入门之匹配器与测试异步代码
一、匹配器
1、对于一般的数字与字符串类型使用 toBe
test('adds 1 + 2 to equal 3', () => {expect(1 + 2).toBe(3);
});test('a + b to equal ab', () => {expect('a' + 'b').toBe('ab');
});
2、对于对象与数组类型使用 toEqual
// 数组项需一一对应
test('array is equal', () => {expect([1, 2, 3]).toEqual([1, 2, 3]);
})// 对象的属性顺序无所谓
test('object is equal', () => {expect({ name: 'wsh', age: 18 }).toEqual({ age: 18, name: 'wsh' });
})
3、对于null、undefined 和 boolean 类型可使用:
- toBeNull:仅匹配null
- toBeUndefined:仅匹配undefined
- toBeDefined:非undefined均匹配
- toBeTruthy:若 if 判断为真,则匹配
- toBeFalsy:若 if 判断为假,则匹配
4、对于浮点数使用 toBeCloseTo 以消除误差
test('adding floating point numbers', () => {const value = 0.1 + 0.2;expect(value).toBeCloseTo(0.3);
});
5、若想测试一个函数在特定情况会抛出的错误,使用 toThrow
function compileAndroidCode() {throw new Error('you are using the wrong JDK');
}// 注意:expect的参数是一个函数,而不是函数调用
test('compiling android goes as expected', () => {expect(() => compileAndroidCode()).toThrow();expect(() => compileAndroidCode()).toThrow(Error);expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');expect(() => compileAndroidCode()).toThrow(/JDK/);
});
以上只是一些常用的匹配器,详见:传送门
二、测试异步代码
1、回调形式的异步函数
// fetchData用于模拟一个2秒之后返回的异步请求
const fetchData = (fn: Function) => {return new Promise((res: Function) => {setTimeout(() => {res('apple')}, 2000)}).then((data) => {fn(data)})
}test('the data is apple', () => {function callback(data: string) {expect(data).toBe('apple');}fetchData(callback);
});
运行以上用例,结果为:
看似成功了,但是有警告。如果我们让 fetchData 返回 banana,也就是将上面的 res(‘apple’) 改为 res(‘banana’),再次跑这个用例,结果为:
可以看到还是成功了,但是多了一截说期望是 apple 但接收到了banana。这是回调形式异步函数的坑,根据官网,需要我们加一个 done 参数,我们具体看一看这个参数有什么用。
第一步,继续返回 banana ,并且接收 done 参数,但是不调用:
const fetchData = (fn: Function) => {return new Promise((res: Function) => {setTimeout(() => {res('banana')}, 2000)}).then((data) => {fn(data)})
}// 注意done我们仅接收,但不调用
test('the data is apple', (done) => {function callback(data: string) {expect(data).toBe('apple');}fetchData(callback);
});
结果为:
终于失败了,第一个导致失败的原因是接收到的 banana 与期望的 apple 不一致,第二个原因是这个用例不知道何时结束所以超时了。所以,done 的意义在于告知这是一个异步代码测试,且应该在所有expect函数执行完之后调用。
第二步,将返回值改回 apple,接收 done 参数并调用:
const fetchData = (fn: Function) => {return new Promise((res: Function) => {setTimeout(() => {res('apple')}, 2000)}).then((data) => {fn(data)})
}test('the data is apple', (done) => {function callback(data: string) {expect(data).toBe('apple');done();}fetchData(callback);
});
成功且无任何报错:
2、Promise形式的异步
const fetchData = () => {return new Promise((res: Function) => {setTimeout(() => {res('apple')}, 2000)})
}// 注意注意注意,必须return掉,否则这个用例会与上述未传入done参数的表现一致
test('the data is apple', () => {return fetchData().then(data => {expect(data).toBe('apple');})
});
以上是成功的 Promise,若想测试失败的 Promise 如下:
const fetchData = () => {return new Promise((res: Function, rej: Function) => {setTimeout(() => {rej('error')}, 2000)})
}test('the fetch fails', () => {return fetchData().catch(e => {expect(e).toMatch('error');})
});
官网在失败的 Promise 的例子中让我们确保添加了 expect.assertions 来验证执行了几次 expect 函数,在我写的例子中 fetchData 是一定失败的,所以不必添加 expect.assertions。实际测试异步代码的时候,expect.assertions 是必不可少的,具体可以看:如果您正在等待任何异步函数调用,是否需要使用Expect.assertions()?
3、.resolves / .rejects
const fetchData = () => {return new Promise((res: Function) => {setTimeout(() => {res('apple')}, 2000)})
}// 这里也必须return掉
test('the data is apple', () => {return expect(fetchData()).resolves.toBe('apple');
});
这只是写法不一样,用 resolves 代替了 .then。失败的如下:
const fetchData = () => {return new Promise((res: Function, rej: Function) => {setTimeout(() => {rej('error')}, 2000)})
}test('the fetch fails', () => {return expect(fetchData()).rejects.toMatch('error');
});
4、Async/Await
const fetchData = () => {return new Promise((res: Function) => {setTimeout(() => {res('apple')}, 2000)})
}test('the data is apple', async () => {const data = await fetchData();expect(data).toBe('apple');
});
以上是成功的异步,下面是失败的:
const fetchData = () => {return new Promise((res: Function, rej: Function) => {setTimeout(() => {rej('error')}, 2000)})
}test('the fetch fails', async () => {try {await fetchData();} catch (e) {expect(e).toMatch('error');}
});
async、await 可以与.resolves 和 .rejects 同用:
const fetchData = () => {return new Promise((res: Function) => {setTimeout(() => {res('apple')}, 2000)})
}test('the data is apple', async () => {await expect(fetchData()).resolves.toBe('apple');
});
以上是成功的,下面是失败的:
const fetchData = () => {return new Promise((res: Function, rej: Function) => {setTimeout(() => {rej('error')}, 2000)})
}test('the fetch fails', async () => {await expect(fetchData()).rejects.toMatch('error');
});
Jest测试框架入门之匹配器与测试异步代码相关推荐
- Jest 测试框架 expect 和 匹配器 matcher 的设计原理解析
副标题:SAP Spartacus SSR 优化的单元测试分析之二 - 调用参数检测 源代码: it(`should pass parameters to the original engine in ...
- spring框架mvc框架_Spring的MVC测试框架入门–第1部分
spring框架mvc框架 最新推出的主要Spring框架是Spring MVC测试框架,Spring Guys声称它是"一流的JUnit支持,可通过流畅的API测试客户端和服务器端Spri ...
- Spring MVC测试框架入门–第1部分
最新推出的主要Spring框架是Spring MVC测试框架,Spring Guys声称它是"一流的JUnit支持,可通过流畅的API测试客户端和服务器端Spring MVC代码" ...
- spring框架mvc框架_Spring MVC测试框架入门–第2部分
spring框架mvc框架 这个迷你系列的第一个博客介绍了Spring MVC测试框架,并演示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途. ...
- Spring MVC测试框架入门–第2部分
这个迷你系列的第一个博客介绍了Spring MVC测试框架,并展示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途. 现在是时候讨论使用框架进行集 ...
- 自动化测试(一)基本介绍——测试框架的分类 单元测试工具 E2E测试工具
自动化测试(一)基本介绍--测试框架的分类 & 单元测试工具 & E2E测试工具 5-3 自动化测试 课程介绍 在前端界,浏览器兼容性是让工程师们头疼的问题,对于经验丰富的人来说,很清 ...
- android开发自制计算器测试图,基于uiautomator测试框架的计算器自动化测试方法和测试系统的制作方法...
基于uiautomator测试框架的计算器自动化测试方法和测试系统的制作方法 [技术领域] [0001]本发明涉及自动化测试技术领域,特别是一种基于uiautomator测试框架的计算器自动化测试方法 ...
- 【图像配准】多图配准/不同特征提取算法/匹配器比较测试
前言 本文首先完成之前专栏前置博文未完成的多图配准拼接任务,其次对不同特征提取器/匹配器效率进行进一步实验探究. 各类算法原理简述 看到有博文[1]指出,在速度方面SIFT<SURF<BR ...
- Jest测试框架入门之Mock
说到mock,大家第一个想到的肯定是项目里经常用来模拟接口返回值的 mockjs库 ,Jest里的mock有所不同,下面会举一些例子来分别讲一讲 jest.fn().jest.mock().jest. ...
最新文章
- JAVA CP936编码转utf8_对一个目录的文件从cp936转换成utf-8
- 编译程序加不加 -lpthread 的区别【转】
- Fabric 架构和概念
- Flume fan out(扇出)详解
- python 字符串%和format_python基础任务二
- 链表笔试题汇编(一)
- SpringBoot指南(八)——SpringBoot整合Redis
- 安装flash player提示版本不是最新,无法安装
- 计算机五大类型,操作系统目前有五大类型
- 网易云音乐刷了我的过去...
- rs232接口_串口,COM口,TTL,RS232,RS485,UART的区别详解
- GIS空间分析(一)——空间分析与GIS
- 微信群解答_各月各旬降水量均值_巧用groupby
- Java调用阿里云短信通道服务
- 金融计算机求log,cfa计算器怎么算对数
- 透明度混合(Alpha blending)
- RecyclerView 刷新Item图片闪烁
- Mesos 1.1.1 发布说明
- CTF Crypto简单题学习思路总结(持续更新)
- Cisco ❀ 二层交换安全技术