Mocha beforeEach/afterEach钩子跨describe块及文件执行异常
Mocha describe块内beforeEach/afterEach钩子跨块执行问题解决
核心问题
你所有的describe块都用了异步箭头函数(async () => {}),这是导致钩子跨块执行的根本原因。Mocha的describe是用来同步定义测试套件结构的,它本身不支持异步执行——你把describe标记为async后,Mocha无法正确识别钩子的作用域,会把这些钩子错误地挂载到全局或共享上下文,导致每个测试用例都触发所有describe里的钩子。
解决方案
把所有describe的async关键字去掉,改成普通函数或同步箭头函数即可。
修改后的代码示例
global.spec.ts
before(async function () { // set up stuff here }); describe('Test suite', () => { it('is just here to execute the before and after', async () => { }); }); after(async function () { // tear down stuff here });
foo.spec.ts
describe('Foo describe', () => { beforeEach(async () => { console.log('prepare some stuff for each foo test'); }); afterEach(async () => { console.log('clean up after each foo test'); }); it(`should test some foo case`, async () => { // test something }); });
bar.spec.ts
describe('Bar describe', () => { beforeEach(async () => { console.log('prepare some stuff for each bar test'); }); afterEach(async () => { console.log('clean up after each bar test'); }); it(`should test some bar case`, async () => { // test something }); });
验证结果
修改后重新运行测试,控制台输出会恢复正常:
prepare some stuff for each foo test should test some foo case clean up after each foo test prepare some stuff for each bar test should test some bar case clean up after each bar test
补充说明
Mocha的测试用例(it)和钩子(before/after/beforeEach/afterEach)可以是异步的(加async),但**describe本身必须是同步执行**的——它的作用是在测试文件加载阶段同步构建测试树,异步的describe会破坏Mocha的作用域管理逻辑,引发各种奇怪的钩子作用域问题。
内容的提问来源于stack exchange,提问作者Benalgin
相关产品推荐
相关产品推荐

