如何为selectOperator工具函数编写正确的单元测试?
解答
嘿,先提个关键问题——你的函数现在有个致命bug:switch语句里的每个case都没有添加break,这会导致代码执行完当前case后继续往下跑所有后续的case。比如你传入"+"时,代码会依次执行加法、减法、乘法、除法,最终返回的是除法结果,完全不符合预期。所以在写测试之前,得先修复这个bug,否则所有测试都会失败。
第一步:修复函数
给每个case加上break,同时建议添加default分支处理未知运算符的情况:
export const selectOperator = (operator, n1, n2) => { let result; switch(operator) { case '+': result = n1 + n2; console.log(result); break; // 阻止代码继续向下执行 case "-": result = n1 - n2; break; case "*": result = n1 * n2; break; case "/": result = n1 / n2; break; default: throw new Error('不支持的运算符'); // 处理非法运算符 } return result; }
第二步:编写完整单元测试
假设我们用最常用的Jest测试框架来写测试,步骤如下:
1. 准备测试环境
如果还没安装Jest,先执行:
npm install --save-dev jest
然后在package.json中添加测试脚本:
{ "scripts": { "test": "jest" } }
2. 编写测试用例
创建测试文件(比如selectOperator.test.js),覆盖所有场景:
import { selectOperator } from './你的函数文件路径'; // 替换成实际文件路径 describe('selectOperator 运算函数测试', () => { // 测试加法场景 test('传入"+"时,正确计算两个数的和', () => { expect(selectOperator('+', 2, 3)).toBe(5); expect(selectOperator('+', -1, 1)).toBe(0); expect(selectOperator('+', 0, 0)).toBe(0); }); // 测试减法场景 test('传入"-"时,正确计算两个数的差', () => { expect(selectOperator('-', 5, 2)).toBe(3); expect(selectOperator('-', 3, 5)).toBe(-2); expect(selectOperator('-', 0, 0)).toBe(0); }); // 测试乘法场景 test('传入"*"时,正确计算两个数的积', () => { expect(selectOperator('*', 4, 5)).toBe(20); expect(selectOperator('*', -2, 3)).toBe(-6); expect(selectOperator('*', 0, 100)).toBe(0); }); // 测试除法场景 test('传入"/"时,正确计算两个数的商', () => { expect(selectOperator('/', 10, 2)).toBe(5); expect(selectOperator('/', 7, 2)).toBe(3.5); expect(selectOperator('/', -8, 4)).toBe(-2); }); // 测试除法边界情况:除以0 test('传入"/"且除数为0时,返回对应无穷值', () => { expect(selectOperator('/', 5, 0)).toBe(Infinity); expect(selectOperator('/', -5, 0)).toBe(-Infinity); }); // 测试非法运算符场景 test('传入不支持的运算符时,抛出错误', () => { expect(() => selectOperator('%', 2, 3)).toThrow('不支持的运算符'); expect(() => selectOperator('', 1, 2)).toThrow('不支持的运算符'); }); });
3. 运行测试
在终端执行命令,查看测试结果:
npm test
测试用例设计思路
- 覆盖基础场景:每个运算符都测试正数、负数、零的组合,确保常规运算逻辑正确。
- 边界场景:比如除法除以0、零参与运算的情况,这些容易被忽略但可能出问题的场景必须覆盖。
- 异常场景:处理非法运算符的情况,确保函数在传入无效参数时能给出明确的错误提示。
内容的提问来源于stack exchange,提问作者Aessandro
相关产品推荐
相关产品推荐

