You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动