(六)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
靠前的一次优先执行。
浙公网安备 33010602011771号