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

ConvertHandler.getNum单元测试与前端行为不一致问题排查

问题根源与解决方案

核心问题:测试断言逻辑与函数实际行为不匹配

你的单元测试和函数行为不一致的原因主要有两点:

1. assert.throw的使用错误

getNum函数并没有抛出Error异常,而是返回了字符串"invalid number"。但你的测试用例用assert.throw来检测,这个断言是用来验证函数是否主动抛出异常的,自然会失败。

2. 替换断言时的写法错误

当你换成assert.strictEqual时,错误地传递了函数引用(() => convertHandler.getNum(...))而非函数执行的结果,导致断言的是「函数对象」和「字符串invalid number」相等,必然返回错误。

代码执行流程验证

以输入"3/2/3 mi"为例:

  • regexSplit提取数字部分为"3/2/3"
  • onlyOneDiv处理该字符串,split后得到长度为3的数组,因此返回false
  • fractionArray为false,执行isNaN(parseFloat(fractionArray[0]))时,false[0]是undefined,parseFloat(undefined)返回NaN,触发条件判断,函数返回"invalid number"

前端能正常显示错误,是因为前端代码应该是判断了getNum的返回值是否为"invalid number",再渲染错误提示,而非依赖函数抛出异常。

修正后的单元测试

将测试用例修改为断言返回值即可:

test("convertHandler.getNum should return an error on a double-fraction input", function () {
  assert.strictEqual(convertHandler.getNum("3/2/3 mi"), "invalid number");
});

可选优化(若想改为抛出异常)

如果你希望getNum函数通过抛出异常来传递错误,可修改函数逻辑:

this.getNum = function (input) {
  const number = regexSplit(input)[0] || "1";

  const fractionArray = onlyOneDiv(number);

  if (isNaN(parseFloat(fractionArray[0])) || isNaN(parseFloat(fractionArray[1] || "1"))) {
    throw new Error("invalid number"); // 改为抛出Error对象
  }

  return parseFloat(fractionArray[0]) / parseFloat(fractionArray[1] || "1");
};

此时原测试用例的assert.throw就能正常工作,但前端代码也需要相应调整为捕获异常来处理错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:05:04