深拷贝单元测试核心是验证项目中实际使用场景下的行为:需用 toequal 和 tobe 双校验确保结构一致且引用隔离,覆盖 date、regexp、map、set 等特殊类型及循环引用、边界值,并按需检查不可枚举属性与原型链。

深拷贝的单元测试重点不是“测深拷贝函数本身是否完美”,而是验证它在你项目中实际使用场景下的行为是否符合预期:能否正确处理常见边界类型、不产生引用污染、保持数据结构完整性。Jest 本身不提供深拷贝断言,需结合 toEqual(浅比较结构)和 toBe(验证引用隔离)双校验,再覆盖典型用例。
验证引用隔离(核心必测)
深拷贝最根本的要求是新旧对象互不影响。仅用 toEqual 不够,必须用 toBe 确保非原始值不共享内存地址。
- 对对象、数组、嵌套结构分别修改副本属性,检查原对象对应字段未变
- 特别关注 Date、RegExp、Map、Set、TypedArray 等内置对象——它们常被忽略或错误处理
- 示例:
const original = { a: { b: 1 } }; const copy = deepClone(original); copy.a.b = 2; expect(original.a.b).toBe(1);
覆盖特殊类型与边界值
多数深拷贝实现(如 JSON.parse(JSON.stringify()))会在这些地方失败,必须单独断言:
-
null / undefined / NaN / Infinity:确保拷贝后值相同且类型一致(
typeof NaN === 'number') -
Date / RegExp:检查拷贝后仍是同类型实例,且值相等(
copy instanceof Date && copy.getTime() === original.getTime()) -
Map / Set:验证键值对/元素数量、内容一致,且
copy !== original - 循环引用:若你的深拷贝支持循环引用(如使用 WeakMap 缓存),构造含 self-reference 的对象并确认不栈溢出、结果结构正确
测试不可枚举属性与原型链(按需)
如果你的深拷贝声称“完全复制对象状态”,需明确其设计目标:
- 标准深拷贝(如 Lodash
cloneDeep)默认只处理可枚举自有属性,不复制原型方法或不可枚举属性 - 若需保留原型,应单独写测试:创建带自定义 prototype 的对象,验证
copy.constructor === original.constructor且方法可调用 - 若处理 Symbol 属性,用
Object.getOwnPropertySymbols()检查 key 和 value 是否完整迁移
性能与错误边界(可选但推荐)
避免深拷贝在真实场景中成为瓶颈或静默失败:
- 传入超大嵌套对象(如 10k 层递归或 1MB JSON)时,验证是否超时或抛出合理错误(而非卡死)
- 传入函数、undefined、Symbol 作为对象属性值时,检查是否按预期保留(或明确文档说明忽略)
- 用
jest.fn()mock 构造函数,测试深拷贝是否意外执行 constructor(如对 class 实例)











