beforeEach/afterEach用done报Resolution method is overspecified错误如何解决
问题原因与解决方案
错误1:Resolution method is overspecified 报错
- 触发原因:你在异步钩子中同时声明了
async函数(会自动返回Promise)和done回调两种异步通知方式,测试框架(Mocha/Jest等)无法判定该以哪种信号作为异步执行完成的标志,因此抛出冲突错误。 - 修复方案:移除钩子中的
done参数与done()调用,仅保留async/await逻辑即可,修正后代码如下:
beforeEach(async () => { await db.migrate.rollback(migrationConfig); await db.migrate.latest(migrationConfig); await db.seed.run(seedConfig); }); // 测试执行后清理数据库 afterEach(async () => { await db.migrate.rollback(migrationConfig); });
错误2:测试通过后终端卡住无法退出
- 触发原因:knex初始化后会维持数据库连接池的活跃连接,Node.js事件循环检测到有活跃句柄时不会自动退出进程。
- 修复方案:添加全局后置钩子,所有测试执行完成后主动销毁knex连接池,代码如下:
// 所有测试完成后关闭数据库连接 after(async () => { await db.destroy(); });
补充说明
- 你现有测试用例中的
done回调不需要修改,该用例未使用async声明,仅通过done通知异步完成,不存在冲突问题。 - 如果你使用的是Jest框架,上述销毁连接的全局钩子需替换为
afterAll。
内容的提问来源于stack exchange,提问作者Saaransh Menon
相关产品推荐
相关产品推荐

