aftereach 是 jest 中在每个测试用例执行后自动运行清理逻辑的钩子,用于防止状态污染;适用于清理全局变量、mock 函数、定时器、事件监听器和 dom 元素等。

afterEach 是 Jest 等测试框架提供的钩子函数,用于在每个测试用例(test 或 it)执行完毕后自动运行清理逻辑,避免测试间状态污染。
什么时候该用 afterEach
当你在测试中修改了以下内容时,就该考虑用 afterEach 清理:
- 全局变量或模块级变量(如
window.localStorage、document.body.innerHTML) - 模拟函数(mock functions)的调用记录或返回值
- 定时器(
setTimeout、setInterval)未清除,可能触发异步副作用 - 事件监听器未解绑,导致内存泄漏或后续测试误触发
- 创建的 DOM 元素未移除(尤其在使用
document.createElement或挂载组件时)
基本写法和常见清理示例
直接在测试文件顶层或 describe 块内定义即可,Jest 会自动为每个 test 调用一次:
afterEach(() => {
// 清空 localStorage
localStorage.clear();
// 恢复被 mock 的函数(如果用了 jest.mock 或 jest.spyOn)
jest.restoreAllMocks();
// 清除所有定时器,防止 pending timeout 影响下一个测试
jest.clearAllTimers();
// 移除动态插入的 DOM 元素(例如测试中 append 到 body 的节点)
const tempEl = document.getElementById('test-container');
if (tempEl) tempEl.remove();
});
注意作用域和执行时机
afterEach 在每个 test 后执行,但不保证在 beforeEach 之前运行 —— 它严格按“test → afterEach”顺序串行执行。几个关键点:
- 它不会捕获测试中的异常;即使测试失败,
afterEach仍会执行(适合做兜底清理) - 不能
await异步清理操作(除非你显式返回 Promise),否则 Jest 可能提前结束测试 - 若清理逻辑本身可能出错,建议加
try/catch,避免一个清理失败阻断整个测试套件 - 不要在
afterEach里做断言(如expect(...)),这不属于验证逻辑,且容易掩盖真实问题
和 afterAll 的区别别搞混
afterEach 针对每个测试运行一次;afterAll 只在整个 describe 块所有测试跑完后执行一次。比如:
- 重置 mock 调用计数 → 用
afterEach(每个测试都该从干净状态开始) - 关闭测试用的 HTTP server 或数据库连接 → 用
afterAll(只需关一次)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











