JavaScript Jest测试getTaxonPhotos时URL结尾观测ID用例失败修复
问题定位
最后一个测试用例失败的核心原因有两个,附带一个潜在逻辑bug:
- 硬编码观测ID:代码中写死
let observationId = "1384377507";,没有读取当前遍历的观测条目自身的id属性,导致生成的URL末尾拼接的ID和实际条目的ID不匹配,无法通过endsWith校验 - 对象引用污染:存储各尺寸URL的
pho_obj定义在循环外部,每次循环都是修改同一个对象再推入数组,最终数组里的所有元素都会指向最后一次循环修改的对象,数据会全部错乱,只是当前前三个测试没有校验多元素的内容一致性,所以问题没有暴露 - 冗余无效逻辑:代码里从
default_photo属性中查找数字类型值作为_id的逻辑完全无用,这个ID是照片自身的ID,和需要拼接的观测ID不是同一个字段
修复方案
直接替换原getTaxonPhotos函数实现即可,修复点完全对应上述问题:
- 将
pho_obj声明移到forEach循环内部,每次处理单条记录时新建独立对象,避免引用污染 - 删除硬编码的观测ID,直接从当前遍历的条目上读取
element.id作为真实观测ID - 清理冗余的无效ID查找逻辑,简化重复的分支判断代码
修复后的完整代码如下:
function getTaxonPhotos(data) { let patt = /(http(s)?:\/\/)/ let arr = Array(); data.results.forEach(function(element) { if (element.hasOwnProperty('taxon') && element.taxon.default_photo) { // 每次循环新建独立的照片对象,避免引用互相覆盖 let pho_obj = { original: "", square: "", small: "", medium: "", large: "" }; // 直接读取当前观测条目的真实ID,不再硬编码 let observationId = element.id.toString(); // 提取default_photo中的基础URL let _values = Object.values(element.taxon.default_photo); let _url = _values.find(sector => typeof sector === 'string' && sector.match(patt)); // 截取到照片存储路径的公共前缀 let photoIdMatch = _url.match(/\/(\d+)\//); _url = _url.substring(0, _url.indexOf(photoIdMatch[0]) + photoIdMatch[0].length); // 批量拼接各尺寸照片URL,替代重复的switch分支 for (let size in pho_obj) { pho_obj[size] = `${_url}${size}.jpg?${observationId}`; } arr.push(pho_obj); } }); return arr; }
验证说明
修复后重新运行Jest测试:
- 原有的数组结构校验、空taxon返回空数组、全量数据长度校验3个用例不受影响,保持通过
- URL末尾携带对应观测ID的校验用例可正常通过
- 潜在的对象引用污染问题被修复,数组中每条照片数据都是独立对象,不会出现数据互相覆盖的异常
内容的提问来源于stack exchange,提问作者Sahil Patel
相关产品推荐
相关产品推荐

