新闻中心
JS测试框架实战_Jest单元测试指南
Jest是前端流行的J*aScript测试框架,具备零配置、内置断言、快速执行、覆盖率报告和快照测试等优势。通过npm test可运行基础测试,使用expect与匹配器如.toBe、.toEqual验证结果,支持异步代码测试与jest.fn()、jest.mock()模拟函数和模块,结合--coverage生成覆盖率报告并设阈值,强调测试独立性与mock清理,提升项目质量与维护性。

单元测试是保证代码质量的重要手段,而Jest 是目前前端领域最受欢迎的 J*aScript 测试框架之一。它由 Facebook 开发并维护,具备开箱即用、配置简单、功能强大等优点,特别适合 React 项目,也广泛用于 Node.js 和普通 JS 应用中。本文将带你从零开始掌握 Jest 的核心用法,并应用于实际开发场景。
为什么选择 Jest?
Jest 能迅速流行起来,离不开以下几个关键特性:
- 零配置启动:安装后无需复杂配置即可运行测试。
- 内置断言库和测试工具:自带 expect 断言、spy、mock 功能,无需额外引入 Chai 或 Sinon。
- 快速并行执行:每个测试文件在独立进程中运行,提升速度。
- 优秀的覆盖率报告:通过 --coverage 参数一键生成详细覆盖情况。
- 快照测试支持:适用于 UI 组件或复杂数据结构的测试。
快速上手:第一个 Jest 测试
假设你有一个简单的加法函数:
function sum(a, b) {return a + b;
}
module.exports = sum;
对应的测试文件(sum.test.js)如下:
const sum = require('./sum');test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
在 package.json 中添加脚本:
"scripts": {"test": "jest"
}
运行 npm test,你会看到测试通过的信息。这就是最基础的 Jest 使用流程。
常用测试语法与匹配器
Jest 使用 expect 配合 matcher(匹配器)来验证结果。常见的 matcher 包括:
- .toBe(value):严格相等(===),适合原始类型。
- .toEqual(value):深度比较对象或数组内容。
- .toBeDefined() / .toBeUndefined():检查是否已定义。
- .toBeTruthy() / .toBeFalsy():判断真假值。
- .toContain(item):检查数组或字符串是否包含某项。
- .toThrow():验证函数是否抛出异常。
例如:
test('throws on invalid input', () => {expect(() => sum('a', 'b')).toThrow();
});
Mock 函数与模块模拟
在真实项目中,我们常需要隔离外部依赖,比如 API 请求、定时器或第三方模块。Jest 提供了强大的 mock 支持。
比如有一个调用 fetchUser 的函数:
Visla
AI视频生成器,快速轻松地将您的想法转化为视觉上令人惊叹的视频。
100
查看详情
function getUser(id, callback) {fetchUser(id).then(data => callback(data));
}
你可以 mock fetchUser 模块:
jest.mock('./fetchUser');test('calls callback with user data', async () => {
const mockCallback = jest.fn();
const fakeData = { id: 1, name: 'John' };
require('./fetchUser').mockResolvedValue(fakeData);
await getUser(1, mockCallback);
expect(mockCallback).toH*eBeenCalledWith(fakeData);
});
这里使用了 jest.fn() 创建一个监听函数,可以追踪调用次数、参数等信息。
异步代码测试
处理 Promise 或 async/await 函数时,测试写法略有不同。
示例函数:
async function fetchData() {const res = await fetch('/api/data');
return res.json();
}
测试方式:
test('fetches data successfully', async () => {jest.spyOn(global, 'fetch').mockResolvedValue({
json: jest.fn().mockResolvedValue({ message: 'hello' })
});
const data = aw
ait fetchData();
expect(data.message).toBe('hello');
global.fetch.mockRestore();
});
注意:使用 spyOn 模拟全局 fetch 后,记得在最后 restore 原始实现,避免影响其他测试。
覆盖率报告生成
运行以下命令生成覆盖率报告:
npm test -- --coverageJest 会在根目录生成 coverage 文件夹,打开 index.html 可查看每行代码的覆盖情况。你可以设置最小覆盖率阈值防止质量下降:
// package.json"jest": {
"coverageThreshold": {
"global": {
"branches": 80,
"functions": 90,
"lines": 90,
"statements": 90
}
}
}
基本上就这些。Jest 的设计目标就是让测试变得简单可靠。只要坚持写测试,配合合理的 mock 和断言,就能显著提升项目的可维护性和稳定性。不复杂但容易忽略的是:保持测试的独立性、避免副作用、及时清理 mock。做到这些,你的测试才是可持续的。
以上就是JS测试框架实战_Jest单元测试指南的详细内容,更多请关注其它相关文章!
# jest
# 第一个
# 几个
# 您的
# 的是
# 复用
# 自定义
# 你可以
# 数据结构
# node
# node.js
# 前端
# js
# html
# java
# javascript
# react
# 单元测试
# json
# 南山seo信息优化
# 谷歌外贸网站推广怎么做
# 网站和抖音推广行业销售
# 二手手机怎么做网站推广
# 杭州关键词排名稳定提升
# 圣诞节酒店营销推广活动
# 关键词电影网站排名推广
# 网站建设维护服务
# 妄自菲薄近义词网站建设
# 变装网站建设素材图片
# 就能
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
AO3官方在线访问地址 Archive of Our Own最新镜像合集
必由学官方登录入口 必由学教师学生账号快速访问
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析
外媒分析《GTA6》定价:卖100美元可以但真没必要!
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
Pyrogram与g4f集成:异步编程实践与常见错误解决
vivo云服务网页版登录 怎么登录vivo云服务网页版
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
HTML空白字符处理机制:渲染、DOM与编码实践
服务端验证_j*ascript输入检查
京东单号查询入口_京东快递订单追踪入口
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略
SteamMachine定价或为699美元 大家想入手吗?
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
Win11截图该按哪些键 Win11截屏完整流程解析【教程】
ArrayList与LinkedList操作复杂度详解:遍历与修改
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
Pygame教程:解决用户输入与游戏状态更新不同步问题
虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作
UC浏览器官网入口2025最新 UC浏览器网页版正式地址
曝R星经典之作开发图 设计简陋但信息密集!
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言
自定义Bag-of-Words实现:处理带负号的词汇权重
夸克浏览器网页版最新地址 夸克浏览器官方入口合集
Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
蛙漫官方正版入口 蛙漫网页在线全集免费观看
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
汽水音乐在线解析 汽水音乐在线解析入口
Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决


2025-11-16
浏览次数:次
返回列表