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的数组,因此返回falsefractionArray为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
相关产品推荐
相关产品推荐

