(六)Jest中钩子函数
在jest中,如果测试用例中需要使用到某个对象 或 在执行测试代码的某个时刻需要做一些必要的处理,直接在测试文件中写基础代码是不推荐的,可以使用jest的钩子函数。
钩子函数概念:在代码执行的某个时刻,会自动运行的一个函数。
首先我们举例:新建counter.js文件,代码如下:
export default class Counter{ constructor(){ this.number = 0 ; } addOne(){ this.number += 1; } minusOne(){ this.number -= 1; } }
编写对应的测试用例:counter.test.js文件,代码如下:
import Counter from './counter.js' const counter = new Counter(); test('测试counter中addOne方法',()=>{ counter.addOne(); expect(counter.number).toBe(1) }) test('测试counter中minusOne方法',()=>{ counter.minusOne(); expect(counter.number).toBe(0) })
上边的测试用例可以正常执行,但是addOne()函数调用的次数会影响counter.number的值,就会影响到minusOne方法执行结果。如果你想addOne与minusOne方法调用互不影响时,此时就不得不引入jest的钩子函数。
1>beforeAll:在所有测试用例执行之前执行一次
import Counter from './counter.js' let counter =null; beforeAll(()=>{ console.log('beforeAll') counter = new Counter(); }) test('测试counter中addOne方法',()=>{ counter.addOne(); expect(counter.number).toBe(1) }) test('测试counter中minusOne方法',()=>{ counter.minusOne(); expect(counter.number).toBe(0) })
注意:使用beforeAll时,需要把之前const类型修改成let 。此时还是会相互影响,依旧不能达成目标。
2>beforeEach:在每个测试用例执行之前执行一次
import Counter from './counter.js' let counter =null; beforeAll(()=>{ console.log('beforeAll') }) beforeEach(()=>{ console.log('beforeEach') counter = new Counter(); console.log('counter.number',counter.number) }) test('测试counter中addOne方法',()=>{ counter.addOne(); expect(counter.number).toBe(1) }) test('测试counter中minusOne方法',()=>{ counter.minusOne(); expect(counter.number).toBe(0) })
此时直接执行npm run test命令时会有一个用例执行失败,执行结果如图所示:
此时返回的结果已经不是0了 ,而是-1!此时addOne 与minusOne两个测试用例已经不会相互影响了。每次执行测试用例前,counter都会初始化!
3>afterAll:在所有测试用例执行完之后执行一次
4>afterEach:在每个测试用例执行完成之后执行一次
import Counter from './counter.js' let counter =null; beforeAll(()=>{ console.log('beforeAll') counter = new Counter(); console.log('counter.number',counter.number) }) afterAll(()=>{ console.log('afterAll') }) beforeEach(()=>{ console.log('beforeEach') counter = new Counter(); }) afterEach(()=>{ console.log('afterEach') }) test('测试counter中addOne方法',()=>{ counter.addOne(); expect(counter.number).toBe(1) }) test('测试counter中minusOne方法',()=>{ counter.minusOne(); expect(counter.number).toBe(-1) })
钩子函数执行顺序:
根据上边案例实际打印结果可以看出这四个钩子函数的执行顺序,如下:
(1)beforeAll > (2)beforeEach > (3)afterEach > (4)afterAll
靠前的一次优先执行。