You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript addFavourite函数Promise异常处理与测试失败排查

问题排查与修复方案

现存问题

  • 成功分支未返回Promise:else分支里的fetch调用链没有加return,函数执行完返回undefined,测试拿不到Promise实例,无法触发后续的.then/.catch,导致测试超时。
  • 重复收藏的错误信息不匹配:测试期望重复时抛出的错误信息是Movie is already added to favourites,你的代码里写的是Movie repeated!,不符合测试要求。
  • 冗余的then调用:重复场景下返回Promise.reject后多余调用了.then(resolved, rejected),这两个参数都没有定义,会抛出额外的未捕获错误。

修复后的代码

function addFavourite(searchId) {
  // 初始值调整为null更合理,避免访问id时出现非预期错误
  let favMovie = null;
  allMovies.forEach((iterator) => {
    if (iterator.id == searchId) {
      favMovie = iterator;
    }
  });
  let movieRepeated = false;
  allFavourites.forEach((iterator) => {
    if (iterator.id == favMovie.id) {
      movieRepeated = true;
    }
  });
  if (movieRepeated) {
    // 移除多余的then调用,修改错误信息匹配测试要求
    return Promise.reject(new Error("Movie is already added to favourites"));
  } else {
    // 新增return,把fetch的Promise链返回给调用方
    return fetch("http://localhost:3000/favourites", {
      method: "POST",
      headers: {
        "content-type": "application/json",
      },
      body: JSON.stringify(favMovie),
    })
      .then((response) => {
        if (response.ok) {
          return response.json();
        }
        return Promise.reject(new Error('Request failed'));
      })
      .then((addedMovie) => {
        allFavourites.push(addedMovie);
        displayFavs(allFavourites);
        return allFavourites;
      });
  }
}

修复后函数在所有分支都返回了正确的Promise实例,重复场景的错误信息也符合测试预期,即可解决超时和用例失败的问题。

内容的提问来源于stack exchange,提问作者Divya Gahlot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 08:27:01