用途:当测试中的 mock 重复、难以维护或需要按测试覆盖时,Mock Factory 会为某个模块、类或接口生成一个带类型、可复用的工厂函数,并附带按测试覆盖与清理重置能力。
主要能力与流程:先做发现,确认目标形态(TS 接口、类、CommonJS/ESM 模块)、测试运行器(Jest 或 Vitest)、覆盖深度(覆盖单个方法返回值还是整个子对象)、异步面、重置策略(beforeEach 或 beforeAll)。再选形态策略:TS 接口用对象字面量逐方法 jest.fn() 并转换为接口;类不实例化,构造匹配公开 API 的普通对象以避开构造副作用;模块用 jest.mock() 加 jest.mocked() 获得类型化访问。可选属性默认省略;重载方法取最宽重载签名;异步方法默认返回 Promise.resolve(undefined) 或合适的类型化默认值。
实现与用法:工厂用 DeepPartial 覆盖类型、各方法配 jest.fn(),返回 jest.Mocked<T> 以获得 .mockReturnValue 等补全;模块 mock 的 jest.mock() 必须置于顶部且不可移动。重置优先用 mockReset() 而非重建工厂,以保持引用稳定;mockClear 仅清调用记录,mockReset 清调用与返回值,mockRestore 仅适用于 jest.spyOn。按测试覆盖使用 mockResolvedValueOnce 堆叠,消费完再回落到默认值。
输出:一个类型化可导出的工厂文件、一个展示构造/按测试覆盖/重置的用法示例,模块 mock 时附 hoisted jest.mock() 块与 jest.mocked() 用法。
限制:基于结构性 fake,依赖 instanceof 检查的测试会失败;私有字段影响公开行为时需注意;Vitest 下把 jest.fn() 换成 vi.fn()、jest.Mocked<T> 换成 vi.Mocked<T>;除用户已有 >3 个工厂并主动要求,否则不生成 barrel 导出。具体平台、收费与价格暂未提供。