前端mock单元测试隔离标准是只验证自身逻辑且不触发真实外部依赖。需严格mock api、localstorage、定时器等外部行为,使用msw/jest.mock控制http、faketimers管理定时器、mock存储读写;mock须可断言、可复现、无副作用,禁用resetallmocks,异步需显式处理promise;模块mock优先__mocks__目录约定;失败错误须指向真实原因,ci启用--detectopenhandles;评审必查未mock副作用。

团队前端 Mock 单元测试的隔离标准,核心就一条:**只验证自己写的逻辑,不触发真实外部依赖**。这不是技术选型问题,而是协作契约——每个测试用例必须明确知道自己“不该做什么”。
Mock 范围必须严格限定在被测单元边界内
组件或函数调用的任何外部行为(API 请求、localStorage、定时器、第三方 SDK、全局事件监听等),只要不属于当前单元职责,就必须被 Mock。不能靠“它大概率不会出错”跳过隔离。
- HTTP 请求统一走 msw 或 jest.mock() 替换整个 fetch/axios 模块,返回预设响应,禁用真实网络
- 定时器(setTimeout/setInterval)必须用 jest.useFakeTimers() 控制,并在测试后 jest.runOnlyPendingTimers() 或 jest.clearAllTimers()
- 对 localStorage/sessionStorage 的读写,应通过 jest.mock('path/to/storage-wrapper') 或直接在 beforeEach 中 mock 全局属性
Mock 行为需可断言、可复现、无副作用
Mock 不是“让它不报错”,而是“让它按预期方式参与流程”。每个 Mock 必须能被验证是否被调用、以什么参数、调用几次。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 用 jest.fn() 替代回调或服务方法,后续通过 mock.calls、mockReturnValue()、mockImplementationOnce() 精确控制
- 禁止在测试中使用 jest.resetAllMocks() 全局重置——它会抹掉其他测试建立的上下文;改用 jest.clearAllMocks() 清空调用记录,保留 mock 定义
- 异步 Mock 必须显式处理 Promise 状态:return Promise.resolve(...) 或 Promise.reject(...),避免 .then/.catch 链未覆盖导致测试“假通过”
模块级 Mock 优先采用自动 Mock + __mocks__ 目录约定
避免零散的 jest.mock('xxx') 散落在各测试文件里。团队应统一约定:
- 所有外部依赖模块(如 utils/api.js、services/auth.js)在项目根目录下建 __mocks__ 文件夹,存放同名 Mock 实现
- 启用 Jest 的 automock: true 或在配置中设置 setupFilesAfterEnv 自动加载 mock 初始化逻辑
- 业务组件测试中直接 import { api } from '@/utils/api',无需手动 mock —— Jest 会自动命中 __mocks__/api.js
测试失败时,错误信息必须指向真实原因
一个隔离失败的 Mock 会导致错误堆栈指向 fetch、XMLHttpRequest 或第三方库,而不是你自己的函数。这是标准失效的明确信号。
- CI 流水线中开启 --detectOpenHandles 和 --forceExit,暴露未清理的定时器或未关闭的 mock listener
- 每个测试文件顶部加 jest.setTimeout(5000),但禁止在测试中用 await new Promise(resolve => setTimeout(resolve, 1000)) 模拟延时——这违反可重复性
- 团队代码评审时,把 “这个 test 是否有未 Mock 的副作用?” 列为必查项,和 ESLint 规则同等对待
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










