# 1.Jest 中四个钩子函数
beforeAll()
钩子函数的意思是在所有测试用例之前进行执行。比如:
beforeAll(()=>{ | |
console.log('上课铃响了~~~~') | |
}) |
写完后,保存文件,会自动执行测试。这时候可以在控制台看到 上课铃响了~~~~
。执行之后可以看到这句话最先执行了。然后才走下面的测试用例。
beforeEach()
钩子函数,是在每个测试用例前都会执行一次的钩子函数,比如我们写如下代码
beforeEach(()=>{ | |
console.log('老师走进教室') | |
}) |
保存后可以看到,每个测试用例执行之前都会先执行一下这个函数。
afterEach()
钩子函数,是在每次测试用例完成测试之后执行一次的钩子函数,比如下面的代码。
afterEach(()=>{ | |
console.log('老师离开教室') | |
}) |
afterAll()
钩子函数是在完成所有测试用例之后才执行的函数。
afterAll(()=>{ | |
console.log('下课') | |
}) |
保存后,可以在控制台看到 afterAll 是最后执行的。这个用于测试都完成后调用某个方法。
工作中最常用的四个钩子函数就是这四个函数了,为了方便学习下面是全部代码:
//index.js | |
export function kecheng1(money){ | |
return money>=200?'名师辅导':'自学' | |
} | |
export function kecheng2(money){ | |
return money>=1000?'双语教程':'普通教程' | |
} |
//index.test.js | |
import {kecheng1,kecheng2} from './index.js' | |
beforeAll(()=>{ | |
console.log('上课铃响了~~~~') | |
}) | |
beforeEach(()=>{ | |
console.log('老师走进教室') | |
}) | |
afterEach(()=>{ | |
console.log('老师离开教室') | |
}) | |
afterAll(()=>{ | |
console.log('下课') | |
}) | |
test('学习1 300元',()=>{ | |
console.log('名师辅导') | |
expect(kecheng1(300)).toBe('名师辅导') | |
}) | |
test('学习2 2000元',()=>{ | |
console.log('双语教程') | |
expect(kecheng2(2000)).toBe('双语教程') | |
}) |
运行后:
# 2. 在项目中肯定会存在多个用例需要测试,那么就需要分组,Jest 引入 describe ()
代码如下:
//index.test.js | |
import {kecheng1,kecheng2} from './index.js' | |
beforeAll(()=>{ | |
console.log('上课铃响了~~~~') | |
}) | |
beforeEach(()=>{ | |
console.log('老师走进教室') | |
}) | |
afterEach(()=>{ | |
console.log('老师离开教室') | |
}) | |
afterAll(()=>{ | |
console.log('下课') | |
}) | |
describe('学习相关课程',()=>{ | |
console.log('学习相关课程') | |
test('学习1 300元',()=>{ | |
console.log('名师辅导') | |
expect(kecheng1(300)).toBe('名师辅导') | |
}) | |
test('学习2 2000元',()=>{ | |
console.log('双语教程') | |
expect(kecheng2(2000)).toBe('双语教程') | |
}) | |
}) |
执行结果如下:
# 3. 学习了 describe 分组,就是为了讲解钩子作用域。Jest 中钩子函数的作用域有下面三个特色:
- 钩子函数在父级分组可作用域子集,类似继承
- 钩子函数同级分组作用域互不干扰,各起作用
- 先执行外部的钩子函数,再执行内部的钩子函数
钩子函数在父级分组可作用域子集,类似继承
import {kecheng1,kecheng2} from './index.js' | |
describe('最外层分组',()=>{ | |
console.log('最外层分组') | |
beforeAll(()=>{ | |
console.log('上课铃响了~~~~') | |
}) | |
beforeEach(()=>{ | |
console.log('老师走进教室') | |
}) | |
afterEach(()=>{ | |
console.log('老师离开教室') | |
}) | |
afterAll(()=>{ | |
console.log('下课') | |
}) | |
describe('学习相关课程',()=>{ | |
console.log('学习相关课程') | |
test('学习1 300元',()=>{ | |
console.log('名师辅导') | |
expect(kecheng1(300)).toBe('名师辅导') | |
}) | |
test('学习2 2000元',()=>{ | |
console.log('双语教程') | |
expect(kecheng2(2000)).toBe('双语教程') | |
}) | |
}) | |
}) |
执行结果:
先执行外部的钩子函数,再执行内部的钩子函数
import {kecheng1,kecheng2} from './index.js' | |
describe('最外层分组',()=>{ | |
beforeAll(()=>{ | |
console.log('上课铃响了~~~~') | |
}) | |
beforeEach(()=>{ | |
console.log('老师走进教室') | |
}) | |
afterEach(()=>{ | |
console.log('老师离开教室') | |
}) | |
afterAll(()=>{ | |
console.log('下课') | |
}) | |
describe('学习相关课程',()=>{ | |
afterEach(()=>{ | |
console.log('开始听课~~~~~~~~~~~') | |
}) | |
console.log('学习相关课程') | |
test('学习1 300元',()=>{ | |
console.log('名师辅导') | |
expect(kecheng1(300)).toBe('名师辅导') | |
}) | |
test('学习2 2000元',()=>{ | |
console.log('双语教程') | |
expect(kecheng2(2000)).toBe('双语教程') | |
}) | |
}) | |
}) |
执行结果:
钩子函数同级分组作用域互不干扰,各起作用
import {kecheng1,kecheng2} from './index.js' | |
describe('最外层分组',()=>{ | |
beforeAll(()=>{ | |
console.log('上课铃响了~~~~') | |
}) | |
beforeEach(()=>{ | |
console.log('老师走进教室') | |
}) | |
afterEach(()=>{ | |
console.log('老师离开教室') | |
}) | |
afterAll(()=>{ | |
console.log('下课') | |
}) | |
describe('学习相关课程1',()=>{ | |
afterEach(()=>{ | |
console.log('开始听课~~~~~~~~~~~1111') | |
}) | |
console.log('学习相关课程') | |
test('学习1 300元',()=>{ | |
console.log('名师辅导') | |
expect(kecheng1(300)).toBe('名师辅导') | |
}) | |
}) | |
describe('学习相关课程2',()=>{ | |
afterEach(()=>{ | |
console.log('开始听课~~~~~~~~~~~2222') | |
}) | |
console.log('学习相关课程') | |
test('学习2 2000元',()=>{ | |
console.log('双语教程') | |
expect(kecheng2(2000)).toBe('双语教程') | |
}) | |
}) | |
}) |
执行结果: