title: Jest author: Gamehu tags: - 测试 categories: - 前端 date: 2020-07-13 10:18:00 --- ### Jest ##### skip,only,each修饰符 `describe`与`test`可以连接`skip`,`only`,`each`修饰符。如`describe.skip('something', testFunction)`,会在测试时跳过这一个`describe`。`only`会使测试只运行指定的测试用例,这在某个测试用例出错Debug时非常好用。`each`修饰符可以执行多次参数不同的测试,它接受一个数组`table`和一个测试函数,`table`里的元素会作为参数传入测试函数。具体语法可以参见[文档](https://jestjs.io/docs/zh-Hans/api#describeeachtable-name-fn-timeout)。 ##### beforeAll,afterAll,beforeEach,afterAll钩子函数 Jest也支持在执行测试用例之前以及之后执行一些代码来做一些工作,像在测试前设置好测试数据、在测试后清理测试数据。这些工作可以作为`beforeAll`、`afterAll`、`beforeEach`、`afterAll`的回调函数。 #### 断言 Jest支持`expect`式的断言,像`expect(1).toBe(1)`,其中`toBe`就是断言部分。Jest支持很丰富的断言。 ##### 相等断言 断言两个基本类型的值相等使用`expect(val1).toBe(val2)`。注意`toBe`断言使用`Object.is()`判断相等。它与`==`以及`===`都有不同。 如果要断言数组或者Object相等,使用`toEqual`断言。它会递归地判断每个属性/元素是否是相等的。 如果要断言数组或者Object相等,使用`toEqual`断言。它会递归地判断每个属性/元素是否是相等的。 > `toStrictEqual(value)` > > 测试对象具有相同的类型和结构 > > 和`.toEqual`不同在于: > > 1. 检查具有未定义属性的键。 例如 使用.toStrictEqual时,{a:未定义,b:2}与{b:2}不匹配。 > 2. 检查数组。 例如 使用.toStrictEqual时,[,1]与[undefined,1]不匹配 > 3. 检查对象类型是否相等。 例如 具有字段a和b的类实例将不等于具有字段a和b的文字对象。 ##### 数字大小断言 ``` test('two plus two', () => { const value = 2 + 2; expect(value).toBeGreaterThan(3);//大于 expect(value).toBeGreaterThanOrEqual(3.5);//大于等于 expect(value).toBeLessThan(5);//小于 expect(value).toBeLessThanOrEqual(4.5);//小于等于 //等于 expect(value).toBe(4); expect(value).toEqual(4); }); ``` 对于浮点数,不能使用`toBe`或者`toEqual`进行相等断言。Jest提供了`toBeCloseTo`断言,可以在忽略一定误差的情况下,断言浮点数相等。 ``` test('adding floating point numbers', () => { const value = 0.1 + 0.2; //expect(value).toBe(0.3); This won't work because of rounding error expect(value).toBeCloseTo(0.3); // This works. }); ``` ##### 真值断言(Truthiness) - `toBeNull` 用于 `null` - `toBeUndefined` 用于`undefined` - `toBeDefined` 与`toBeUndefined` 相反 - `toBeTruthy` 用于值为 true - `toBeFalsy` 用于值为 false ``` test('null', () => { const n = null; expect(n).toBeNull();//pass expect(n).toBeDefined();//pass expect(n).toBeUndefined();// faild }); ``` ##### 字符串相关 Jest提供`toMatch`断言被测试的字符串是否匹配给定正则表达式。 复制 ``` test('but there is a "stop" in Christoph', () => { expect('Christoph').toMatch(/stop/) // pass }); ``` ##### 数组 要断言数组中包含某个子项可以使用`toContain`断言。 复制 ``` const shoppingList = [ 'diapers', 'kleenex', 'trash bags', 'paper towels', 'beer', ]; test('购物清单(shopping list)里面有啤酒(beer)', () => { expect(shoppingList).toContain('beer'); }); ``` ##### 抛出异常 要断言对函数的某些操作会抛出异常可以使用`toThrow`断言。 复制 ``` test('throws on octopus', () => { expect(() => { drinkFlavor('octopus'); }).toThrow(); }); ``` ##### not修饰符 `not`修饰符可以把所有的断言反向,像`expect(1).not.toBe(2)`。 Jest提供的断言不止上面提到那么多。常用到的还有像断言长度的`toHaveLength`,断言对象有某个属性以及属性的值的`toHaveProperty`。更多断言的可以参见[Expect文档](https://jestjs.io/docs/zh-Hans/expect)。