如何用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
相关产品推荐
相关产品推荐

