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

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函数实现即可,修复点完全对应上述问题:

  1. 将pho_obj声明移到forEach循环内部,每次处理单条记录时新建独立对象,避免引用污染
  2. 删除硬编码的观测ID,直接从当前遍历的条目上读取element.id作为真实观测ID
  3. 清理冗余的无效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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:40:05