Jest测试入门 | 青训营

77 阅读3分钟

前言

如果想要代码能够稳定运行,那么对于代码进行测试是必不可少的,而且测试还能够让我们快速了解这个文件中的代码是什么功能,这一点我在完成实践项目的时候也是深有体会,队长搭好了框架,然后安排我完成一个分析的代码,刚接手的时候也是有些懵逼,无从下手,不知道这个要实现怎么样的效果,然后反复去找队长沟通,实际上,队长已经写好了测试案例,给我讲了一下测试案例,我一下子就get到了到底需要我完成什么功能,可见测试还是很重要的。

项目实践中推荐了Jest或者Vitest用于测试。我们组的项目也用的是vitest,由于我之前没有接触过这一块,我也借这个机会学习了测试的相关内容,但是我选择了另一款Jest,因为感觉更经典一些。Jest是JS常用的单元测试框架,这里主要介绍一下基本的用法,

基础类型比较

toBe 用于基础类型的比较,判断expect中的判断对象与预期的值是否相等,其效果相当于**Object.is** (和全等===的不同在于修复了NaN和+0 -0有关的判断)

  • toBeTruthy toBeFalsy 专门用于判断true和false
  • toBeUedefined toBeDefined 专门用于判断变量是否定义或函数返回值
  • toBeCloseTo 用于针对浮点数的比较

not 用于表示非的的判断

test("example", ()=>{
	let num = 1 + 1
	expect( num ).toBe(2)
	expect( num ).not.toBe(3)
	expect(true).toBeTruthy()
	const func = ()=> {}
	expect(func()).toBeUedefined()
}

数字值也有一些常用的比较,如toBeGreaterThan 用于>的断言,toBeLessThanOrEqual 用于≤的断言

引用类型的比较

  • 浅拷贝复制的是对象的引用地址,没有开辟新的栈,复制的结果是两个对象指向同一个地址,所以修改其中一个对象的属性,另一个对象的属性也跟着改变了
  • 深拷贝会开辟新的栈,两个对象对应两个不同的地址,修改对象A的属性,并不会影响到对象B

toBe 不适用于用于深拷贝或是属性完全相同的对象的比较

toEqual 用于比较引用类型的比较,它会深度递归对象的每个属性进行深度比较

正则匹配

toMatch(regexp) 判断匹配字符串是否能够满足正则的验证

数组

toContain(value) :判定某个值是否存在在数组中

toContainEqual(value) :用于判定某个对象元素是否在数组中

toHaveLength(value):断言数组的长度

对象

toHaveProperty(value):断言对象中是否包含某个属性

toMatchObj(value)则用来验证对象能否包含 value 的全部属性

错误抛出

toThrow 和 toThrowError 用于异常情况下的断言

test("error", ()=>{
		const throwError = () => {
      const err = new Error("console err: this is a test error!");
      throw err;
    };
    expect(throwError).toThrow();
    expect(throwError).toThrowError();
})

目前我们学习的都是对JS的测试,但是前端常涉及到页面中的DOM和事件的模拟,对于它们Jest就不能满足需求了,一般需要辅助库,如Enzyme 和 React Testing Library,如果有时间再更新吧