如何在Mocha/Chai中断言按name排序的对象数组?
如何用Mocha/Chai断言对象数组按name属性的排序结果
你遇到的问题其实很常见——localeCompare只是返回两个元素的比较结果(1/-1/0),但要验证整个数组的排序是否符合预期,我们需要先完成排序,再把结果和预期值做对比。下面给你具体的实现步骤和测试示例:
第一步:正确完成数组排序
首先要注意,Array.sort()是原地修改数组的方法,为了不污染原数组(保证测试用例的独立性),建议先复制原数组再排序:
// 用扩展运算符复制原数组,再执行排序 const sortedStuffs = [...Stuffs].sort((a, b) => a.name.localeCompare(b.name));
如果你的name属性包含大小写混合的情况,可以给localeCompare加参数控制排序规则,比如a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })忽略大小写差异。
第二步:用Chai断言排序结果
有两种常用的断言方式,根据你的需求选择:
方式1:提取name属性组成数组对比
如果只关心name的顺序,不需要验证其他属性,可以把排序后的数组的name提取出来,和预期的字符串数组做深度对比:
const { expect } = require('chai'); it('验证数组按name升序排序', () => { const Stuffs = [ { name: "PWE", address: "1234567890" }, { name: "NSA", address: "1234567890" }, { name: "AVE", address: "1234567890" }, { name: "QRE", address: "1234567890" }, ]; const sortedStuffs = [...Stuffs].sort((a, b) => a.name.localeCompare(b.name)); const actualNames = sortedStuffs.map(item => item.name); // 用deep.equal对比数组内容 expect(actualNames).to.deep.equal(["AVE", "NSA", "PWE", "QRE"]); });
方式2:直接对比整个对象数组
如果需要确认整个对象的顺序和属性都正确,可以定义一个预期的对象数组,然后用deep.equal做递归对比:
const { expect } = require('chai'); it('验证数组按name升序排序(完整对象对比)', () => { const Stuffs = [ { name: "PWE", address: "1234567890" }, { name: "NSA", address: "1234567890" }, { name: "AVE", address: "1234567890" }, { name: "QRE", address: "1234567890" }, ]; const sortedStuffs = [...Stuffs].sort((a, b) => a.name.localeCompare(b.name)); const expectedStuffs = [ { name: "AVE", address: "1234567890" }, { name: "NSA", address: "1234567890" }, { name: "PWE", address: "1234567890" }, { name: "QRE", address: "1234567890" }, ]; expect(sortedStuffs).to.deep.equal(expectedStuffs); });
关键注意点
- 一定要复制原数组再排序:避免
sort修改原数组导致其他测试用例受影响 - 使用
deep.equal而非equal:普通的equal只会对比引用,deep.equal会递归检查数组/对象的每一项内容 - 灵活使用
localeCompare参数:如果有特殊排序需求(比如处理非英文、大小写、重音符号),可以调整参数适配场景
内容的提问来源于stack exchange,提问作者user7937612
相关产品推荐
相关产品推荐

