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

如何用Jasmine为TypeScript的compareValues函数编写分支覆盖单元测试

为TypeScript的compareValues函数编写全分支覆盖的单元测试

我来帮你梳理下compareValues函数的所有分支,并写出对应的单元测试用例(这里用Jest作为测试框架示例,你可以轻松适配Mocha等其他框架)。首先咱们先明确这个函数里的所有分支场景:

  • 至少一个对象不存在指定的key → 返回0
  • 两个对象都有指定key,值为字符串(大小写不敏感比较)
  • 两个对象都有指定key,值为数字/布尔等可直接比较的类型
  • 升序(order='asc')和降序(order='desc')的排序逻辑
  • 两个值相等、a的值大于b、a的值小于b这三种比较结果

接下来是具体的测试代码:

// 假设你的类名为DataSorter,替换成你实际的类名和文件路径
import { DataSorter } from './your-file-path';

describe('DataSorter.compareValues', () => {
  const sorter = new DataSorter();

  // 测试分支:对象缺少指定key的情况
  test('should return 0 when either object does not have the specified key', () => {
    const compareFn = sorter.compareValues('name', 'asc');
    
    // 情况1:a有key,b没有
    expect(compareFn({ name: 'Alice' }, { age: 30 })).toBe(0);
    // 情况2:b有key,a没有
    expect(compareFn({ age: 30 }, { name: 'Bob' })).toBe(0);
    // 情况3:两个都没有key
    expect(compareFn({ age: 30 }, { gender: 'male' })).toBe(0);
  });

  // 测试分支:字符串类型的大小写不敏感比较
  test('should compare strings case-insensitively', () => {
    const compareAsc = sorter.compareValues('name', 'asc');
    const compareDesc = sorter.compareValues('name', 'desc');
    
    // 字符串相等(大小写不同)
    expect(compareAsc({ name: 'apple' }, { name: 'APPLE' })).toBe(0);
    // a的字符串大于b(大小写不敏感)
    expect(compareAsc({ name: 'Banana' }, { name: 'apple' })).toBe(1);
    expect(compareDesc({ name: 'Banana' }, { name: 'apple' })).toBe(-1);
    // a的字符串小于b(大小写不敏感)
    expect(compareAsc({ name: 'apple' }, { name: 'Banana' })).toBe(-1);
    expect(compareDesc({ name: 'apple' }, { name: 'Banana' })).toBe(1);
  });

  // 测试分支:数字类型的比较
  test('should compare numbers correctly', () => {
    const compareAsc = sorter.compareValues('age', 'asc');
    const compareDesc = sorter.compareValues('age', 'desc');
    
    // 数字相等
    expect(compareAsc({ age: 25 }, { age: 25 })).toBe(0);
    // a的数字大于b
    expect(compareAsc({ age: 30 }, { age: 25 })).toBe(1);
    expect(compareDesc({ age: 30 }, { age: 25 })).toBe(-1);
    // a的数字小于b
    expect(compareAsc({ age: 20 }, { age: 25 })).toBe(-1);
    expect(compareDesc({ age: 20 }, { age: 25 })).toBe(1);
  });

  // 测试分支:布尔类型的比较(可选,覆盖其他可比较类型)
  test('should compare boolean values correctly', () => {
    const compareAsc = sorter.compareValues('isActive', 'asc');
    const compareDesc = sorter.compareValues('isActive', 'desc');
    
    // 布尔值相等
    expect(compareAsc({ isActive: true }, { isActive: true })).toBe(0);
    // a为true,b为false(true在JS中视为1,false视为0)
    expect(compareAsc({ isActive: true }, { isActive: false })).toBe(1);
    expect(compareDesc({ isActive: true }, { isActive: false })).toBe(-1);
    // a为false,b为true
    expect(compareAsc({ isActive: false }, { isActive: true })).toBe(-1);
    expect(compareDesc({ isActive: false }, { isActive: true })).toBe(1);
  });
});

这些测试用例已经覆盖了compareValues函数里的所有代码分支:

  • 所有if/else条件(包括属性不存在、字符串类型判断、值的大小比较)
  • 升序和降序的逻辑反转
  • 不同数据类型的比较场景

你只需要把DataSorter和文件路径替换成你实际的类名和路径即可。如果用的是其他测试框架,只需要把test换成it,expect的断言语法调整成对应框架的写法就好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:43:55