模拟嵌套对象需兼顾结构一致与字段可控:可用字面量插值、工厂函数动态生成,或MockJS/MSW辅助;注意避免引用共享、特殊类型序列化问题,推荐toStrictEqual断言。

模拟复杂嵌套对象返回值,关键在于结构一致性和可控性——既要让 mock 数据形状与真实接口完全匹配,又要能按需替换部分字段(比如只改某个 id 或状态),避免硬编码整棵大树。
用字面量直接构造嵌套结构(适合静态场景)
最直观的方式是手写一个结构完全对齐的 JS 对象。注意保持 key 名、嵌套层级、数据类型(数组/对象/null/undefined)与真实响应一致。
- 深层属性可使用变量插值,提升复用性:const userId = 'usr_123'; const mockData = { user: { id: userId, profile: { name: 'Alice', tags: ['admin', 'active'] } } };
- 避免意外的引用共享:如果多次返回同一对象且内部有可变属性(如数组 push),应每次 new 或 structuredClone 一份副本。
用工厂函数动态生成(推荐用于含随机/依赖逻辑的场景)
把嵌套对象封装成函数,入参控制变异点,返回全新对象实例。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 示例:const createMockOrder = (opts = {}) => ({ id: opts.id || `ord_${Date.now()}`, items: opts.items || [{ sku: 'SKU-001', qty: 2 }], customer: { name: opts.name || 'Test User', address: { city: 'Shanghai' } } });
- 配合 Jest 的
mockReturnValueOnce可实现“第一次返回空数组、第二次返回带 3 条数据”的测试流。
结合 Mock 库辅助生成(如 MockJS、MSW + fixtures)
当嵌套层级深、字段多、需要伪数据(如随机邮箱、日期、中文名)时,工具能省力保真。
立即学习“Java免费学习笔记(深入)”;
- MockJS 示例:Mock.mock({ 'list|1-10': [{ 'id|+1': 1, 'user|1': { 'name': '@cname', 'avatar': '@image("30x30", "#333", "#fff", "png")' } }] }) —— 自动生成带递增 id 和随机中文名的用户列表。
- MSW 中可将嵌套 fixture 存为独立 JSON 文件,handler 直接返回
ctx.json(fixture),结构清晰易维护。
小心陷阱:引用、函数、getter 不会被自动序列化
mock 返回的对象若含方法、Date 实例、RegExp、Map/Set 或 getter,Jest 等框架在快照或断言中可能显示为空或报错。
- 方案一:用
toStrictEqual替代toEqual,它严格比对类型和结构; - 方案二:mock 前先
JSON.parse(JSON.stringify(obj))脱敏(仅限纯数据对象); - 方案三:对特殊字段单独 mock,例如 customer: { ...realCustomer, createdAt: new Date('2023-01-01') } → 改为 createdAt: '2023-01-01T00:00:00.000Z' 字符串。

















