前言
如果想要代码能够稳定运行,那么对于代码进行测试是必不可少的,而且测试还能够让我们快速了解这个文件中的代码是什么功能,这一点我在完成实践项目的时候也是深有体会,队长搭好了框架,然后安排我完成一个分析的代码,刚接手的时候也是有些懵逼,无从下手,不知道这个要实现怎么样的效果,然后反复去找队长沟通,实际上,队长已经写好了测试案例,给我讲了一下测试案例,我一下子就get到了到底需要我完成什么功能,可见测试还是很重要的。
项目实践中推荐了Jest或者Vitest用于测试。我们组的项目也用的是vitest,由于我之前没有接触过这一块,我也借这个机会学习了测试的相关内容,但是我选择了另一款Jest,因为感觉更经典一些。Jest是JS常用的单元测试框架,这里主要介绍一下基本的用法,
基础类型比较
toBe 用于基础类型的比较,判断expect中的判断对象与预期的值是否相等,其效果相当于**Object.is** (和全等===的不同在于修复了NaN和+0 -0有关的判断)
toBeTruthytoBeFalsy专门用于判断true和falsetoBeUedefinedtoBeDefined专门用于判断变量是否定义或函数返回值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,如果有时间再更新吧