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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:51:36