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
相关产品推荐
相关产品推荐

