如何使用async/await改写Mocha功能测试中的嵌套.then/.catch异步代码
如何用async/await优化Mocha测试中的.then/.catch嵌套代码?
我正在使用Mocha开展功能测试工作,已将测试所需的函数名称、参数及成功提示信息存储至本地JSON文件中,通过比对数据库返回结果与本地JSON中的预期响应进行验证。当前代码中广泛使用.then和.catch处理异步逻辑,存在多层嵌套的情况,希望采用async/await语法优化代码结构,提升代码可读性。请问应如何对如下测试代码进行改写?
原代码示例:
it('Check Authentication', (done) => { readFileData('checkAuth').then(({ params, message}) => { login.checkAuth({ ...params }) .then((result) => { assert(result.message === message); done(); }) .catch((err) => done(err)); }); });
没问题,用async/await改写后代码会清爽很多,而且Mocha完全支持async函数作为测试回调,不需要再依赖done参数了,具体改写如下:
it('Check Authentication', async () => { // 用await替代第一层.then,直接解构获取参数和预期消息 const { params, message } = await readFileData('checkAuth'); // 用await调用异步的认证方法,获取结果 const result = await login.checkAuth({ ...params }); // 执行断言验证 assert(result.message === message); });
几个关键优化点:
- 去掉
done参数:Mocha会自动等待async函数中的Promise完成,不需要手动调用done()来结束测试。 - 扁平化嵌套逻辑:把原来的两层
.then嵌套改成顺序执行的await调用,逻辑一目了然,彻底告别回调地狱。 - 简化错误处理:如果测试过程中出现错误(比如文件读取失败、接口调用出错),async函数会自动返回一个rejected的Promise,Mocha会捕获这个错误并标记测试失败,无需手动写
.catch(done(err))。如果需要自定义错误处理,也可以用try/catch包裹:
it('Check Authentication', async () => { try { const { params, message } = await readFileData('checkAuth'); const result = await login.checkAuth({ ...params }); assert(result.message === message); } catch (err) { // 这里可以添加自定义的错误处理逻辑,比如打印详细日志 console.error('测试出错详情:', err); // 抛出错误让Mocha标记测试失败 throw err; } });
这样改写后,代码的可读性和维护性都会大幅提升,逻辑流程和同步代码几乎一致,非常直观。
内容的提问来源于stack exchange,提问作者whisktucker




