Mocha异步测试报错:async函数与done回调同时使用引发冲突
问题解决:Mocha测试中"Resolution method is overspecified"错误及超时问题
错误原因分析
你第一个测试代码里用了async function (done),这里有个关键细节:所有async函数都会自动返回一个Promise——哪怕你没有显式写return,Mocha也会识别到这个Promise的存在。同时你又传入了done回调,Mocha就会认为你同时指定了两种测试结束的方式(Promise完成/调用done),所以抛出那个错误。
解决方案
有两种正确的写法,选一种就行:
方案1:放弃async/await,只用done回调
处理getBlah()的Promise时用.then(),同时别忘了捕获可能的错误,避免测试卡住:
it('fires change event when calling blah.doSomethingThatFiresChange', function (done) { getBlah() .then(blah => { blah.on('change', () => done()) blah.doSomethingThatFiresChange() }) .catch(done) // 捕获getBlah的错误,传递给done标记测试失败 })
方案2:放弃done回调,用async/await+Promise包装事件
把change事件转换成Promise,让Mocha等待这个Promise完成,就不会超时了:
it('fires change event when calling blah.doSomethingThatFiresChange', async function () { const blah = await getBlah() // 用Promise包装change事件 await new Promise(resolve => { blah.on('change', resolve) blah.doSomethingThatFiresChange() }) })
为什么第二个修改的代码会超时?
因为你注释掉了done(),但测试里的change事件是异步触发的,Mocha不知道要等这个事件,会认为测试已经完成,等到事件触发时测试早就超时了。
内容的提问来源于stack exchange,提问作者Ajouve
相关产品推荐
相关产品推荐

