一、匹配器

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测试框架入门之匹配器与测试异步代码相关推荐

  1. Jest 测试框架 expect 和 匹配器 matcher 的设计原理解析

    副标题:SAP Spartacus SSR 优化的单元测试分析之二 - 调用参数检测 源代码: it(`should pass parameters to the original engine in ...

  2. spring框架mvc框架_Spring的MVC测试框架入门–第1部分

    spring框架mvc框架 最新推出的主要Spring框架是Spring MVC测试框架,Spring Guys声称它是"一流的JUnit支持,可通过流畅的API测试客户端和服务器端Spri ...

  3. Spring MVC测试框架入门–第1部分

    最新推出的主要Spring框架是Spring MVC测试框架,Spring Guys声称它是"一流的JUnit支持,可通过流畅的API测试客户端和服务器端Spring MVC代码" ...

  4. spring框架mvc框架_Spring MVC测试框架入门–第2部分

    spring框架mvc框架 这个迷你系列的第一个博客介绍了Spring MVC测试框架,并演示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途. ...

  5. Spring MVC测试框架入门–第2部分

    这个迷你系列的第一个博客介绍了Spring MVC测试框架,并展示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途. 现在是时候讨论使用框架进行集 ...

  6. 自动化测试(一)基本介绍——测试框架的分类 单元测试工具 E2E测试工具

    自动化测试(一)基本介绍--测试框架的分类 & 单元测试工具 & E2E测试工具 5-3 自动化测试 课程介绍 在前端界,浏览器兼容性是让工程师们头疼的问题,对于经验丰富的人来说,很清 ...

  7. android开发自制计算器测试图,基于uiautomator测试框架的计算器自动化测试方法和测试系统的制作方法...

    基于uiautomator测试框架的计算器自动化测试方法和测试系统的制作方法 [技术领域] [0001]本发明涉及自动化测试技术领域,特别是一种基于uiautomator测试框架的计算器自动化测试方法 ...

  8. 【图像配准】多图配准/不同特征提取算法/匹配器比较测试

    前言 本文首先完成之前专栏前置博文未完成的多图配准拼接任务,其次对不同特征提取器/匹配器效率进行进一步实验探究. 各类算法原理简述 看到有博文[1]指出,在速度方面SIFT<SURF<BR ...

  9. Jest测试框架入门之Mock

    说到mock,大家第一个想到的肯定是项目里经常用来模拟接口返回值的 mockjs库 ,Jest里的mock有所不同,下面会举一些例子来分别讲一讲 jest.fn().jest.mock().jest. ...

最新文章

  1. JAVA CP936编码转utf8_对一个目录的文件从cp936转换成utf-8
  2. 编译程序加不加 -lpthread 的区别【转】
  3. Fabric 架构和概念
  4. Flume fan out(扇出)详解
  5. python 字符串%和format_python基础任务二
  6. 链表笔试题汇编(一)
  7. SpringBoot指南(八)——SpringBoot整合Redis
  8. 安装flash player提示版本不是最新,无法安装
  9. 计算机五大类型,操作系统目前有五大类型
  10. 网易云音乐刷了我的过去...
  11. rs232接口_串口,COM口,TTL,RS232,RS485,UART的区别详解
  12. GIS空间分析(一)——空间分析与GIS
  13. 微信群解答_各月各旬降水量均值_巧用groupby
  14. Java调用阿里云短信通道服务
  15. 金融计算机求log,cfa计算器怎么算对数
  16. 透明度混合(Alpha blending)
  17. RecyclerView 刷新Item图片闪烁
  18. Mesos 1.1.1 发布说明
  19. CTF Crypto简单题学习思路总结(持续更新)
  20. Cisco ❀ 二层交换安全技术

热门文章

  1. 八种必备户外装备包你踏遍地球
  2. 神经网络研究主要内容,神经网络的起源和发展
  3. Android SAF
  4. follow Sam哥 OS 课程的漫长之路
  5. 【NOIP2018】摆渡车
  6. 【开源】小桥流水秒赞 3.8版本全解密无后门
  7. 思科前员工为报复恶意删除400多台虚拟机,公司损失超1600万
  8. CSS实现PC端简单的聊天消息气泡样式
  9. php手机建站,zzzphp免费开源建站系统含手机站
  10. Vmware虚拟机下三种网络模式配置