Jest 入门指南:从零开始编写 JavaScript 单元测试
前言
在前端开发中,单元测试已经成为确保代码质量和稳定性的关键步骤。Jest 作为由 Facebook 开发和维护的功能强大的 JavaScript 测试框架,以其易于配置、丰富的功能和开箱即用的特性,成为众多开发者的首选工具。本文旨在引导你从零开始,逐步掌握如何在项目中高效使用 Jest,提升代码的可靠性和可维护性。
什么是 Jest?
Jest 是一个 JavaScript 测试框架,主要用于测试 React 应用程序,但它不仅仅限于此。它具有以下特点:
- 易于配置:默认配置已经涵盖了大多数用例。
- 零依赖:Jest 自带所有必要的依赖包,开箱即用。
- 强大的匹配器(Matchers):提供了丰富的断言库。
- 快照测试:可以轻松进行 UI 组件的快照测试。
- Mock 功能:支持函数和模块的 Mock,便于测试隔离。
使用步骤
安装 Jest
首先,我们需要在项目中安装 Jest。
npm install --save-dev jest
安装完成后,我们可以在 package.json 中添加一个脚本来运行测试。打开 package.json,找到 “scripts” 部分,添加 “test”: “jest”:
"scripts": {"test": "jest"
}
编写第一个测试
我们先来写一个简单的函数,然后为它编写测试。创建一个名为 sum.js 的文件,并添加以下代码:
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);
});
在测试文件中,我们使用了 test 函数来定义一个测试用例。expect 函数是 Jest 提供的断言工具,用来检查结果是否符合预期。
运行测试
现在,我们可以运行测试了。在终端中运行以下命令:
npm test
你应该会看到类似以下的信息:
PASS ./sum.test.js✓ adds 1 + 2 to equal 3 (5ms)
这表示我们的测试通过了!
进阶使用
测试异步代码
Jest 还支持测试异步代码。假设我们有一个异步函数 fetchData,它返回一个 Promise:
function fetchData() {return new Promise((resolve) => {setTimeout(() => {resolve('peanut butter');}, 1000);});
}module.exports = fetchData;
我们可以通过以下方式测试它:
const fetchData = require('./fetchData');test('the data is peanut butter', async () => {const data = await fetchData();expect(data).toBe('peanut butter');
});
使用 Mock
Jest 提供了强大的 Mock 功能,可以用于模拟函数和模块。假设我们有一个模块 utils.js,里面有一个函数 fetchData:
const axios = require('axios');function fetchData() {return axios.get('/data');
}module.exports = fetchData;
我们可以在测试中 Mock axios 模块:
jest.mock('axios');
const axios = require('axios');
const fetchData = require('./utils');test('fetches successfully data from an API', async () => {const data = { data: 'peanut butter' };axios.get.mockResolvedValue(data);const result = await fetchData();expect(result).toEqual(data);
});
快照测试
快照测试是 Jest 的一个独特功能,特别适合用于测试 UI 组件。快照测试会将组件的输出保存下来,并在以后的测试中与保存的快照进行比较。如果输出发生了变化,测试会失败。
假设我们有一个简单的 React 组件 Button.js:
import React from 'react';
function Button({ label }) {return (<button>{label}</button>);
}
export default Button;
我们可以为这个组件编写快照测试:
import React from 'react';
import renderer from 'react-test-renderer';
import Button from './Button';
test('Button renders correctly', () => {const tree = renderer.create(<Button label="Click me" />).toJSON();expect(tree).toMatchSnapshot();
});
第一次运行测试时,Jest 会创建一个快照文件,存储组件的渲染结果。之后每次运行测试,Jest 会将当前渲染结果与快照文件进行对比。如果有任何差异,测试将失败。
Mock 定时器函数
在测试异步代码时,有时我们需要控制时间流动。Jest 提供了 Mock 定时器函数的功能,让我们能够在测试中精确控制 setTimeout 和 setInterval 等函数。
jest.useFakeTimers();
test('waits 1 second before executing callback', () => {const callback = jest.fn();setTimeout(callback, 1000);// 快进时间jest.advanceTimersByTime(1000);expect(callback).toHaveBeenCalled();
});
参数化测试
在一些情况下,我们需要对不同的输入进行相同的测试。Jest 提供了 test.each 方法,可以用于参数化测试:
const sum = require('./sum');
test.each([[1, 1, 2],[1, 2, 3],[2, 2, 4],
])('sum(%i, %i) should equal %i', (a, b, expected) => {expect(sum(a, b)).toBe(expected);
});
总结
本文通过对 Jest 的基础用法和高级特性的介绍,展示了其作为 JavaScript 测试框架的强大能力。无论是单元测试、异步代码测试、快照测试还是 Mock 功能,Jest 都能为开发者提供简洁而有效的解决方案。
相关文章:
Jest 入门指南:从零开始编写 JavaScript 单元测试
前言 在前端开发中,单元测试已经成为确保代码质量和稳定性的关键步骤。Jest 作为由 Facebook 开发和维护的功能强大的 JavaScript 测试框架,以其易于配置、丰富的功能和开箱即用的特性,成为众多开发者的首选工具。本文旨在引导你从零开始&am…...
【Java Web】Axios实现前后端数据异步交互
目录 一、Promise概述 二、Promise基本用法 三、async和await关键字 四、Axios介绍 4.1 Axios基本用法 4.2 Axios简化用法之get和post方法 五、Axios拦截器 六、跨域问题处理 一、Promise概述 axios是代替原生的ajax实现前后端数据交互的一套新解决方案,而…...
React 第十七节 useMemo用法详解
概述 useMemo 是React 中的一个HOOK,用于根据依赖在每次渲染时候缓存计算结果; 大白话就是,只有依赖项发生变化时候,才会重新渲染为新计算的值,否则就还是取原来的值,有点类似 vue 中的 computed 计算属性…...
鸿蒙项目云捐助第十五讲云数据库的初步使用
鸿蒙项目云捐助第十五讲云数据库的初步使用 在华为云技术使用中,前面使用了云函数,接下来看一下华为云技术中的另外一个技术云数据库的使用。 一、云数据库的创建 这里使用华为云数据库也需要登录到AppGallery Connect平台中,点击进入到之…...
如何构建一个可信的联邦RAG系统。
今天给大家分享一篇论文。 题目是:C-RAG:如何构建一个可信的联邦检索RAG系统。 论文链接:https://arxiv.org/abs/2412.13163 论文概述 尽管大型语言模型 (LLM) 在各种应用中展现出令人印象深刻的能力,但它们仍然存在可信度问题ÿ…...
【深度学习之三】FPN与PAN网络详解
FPN与PAN:深度学习中的特征金字塔网络与路径聚合网络 在深度学习的领域里,特征金字塔网络(Feature Pyramid Networks,简称FPN) 和 路径聚合网络(Path Aggregation Network,简称PAN)…...
Qt学习笔记第71到80讲
第71讲 事件过滤器的方式实现滚轮按键放大 事件体系(事件派发 -> 事件过滤->事件分发->事件处理)中,程序员主要操作的是事件分发与事件处理。我们之前已经通过继承QTextEdit来重写事件实现Ctrl加滚轮的检测,还有一种处理…...
以管理员身份运行
同时按下Ctrl Shift Esc键打开任务管理器,在任务管理器的左上角,点击“文件”菜单,在下拉菜单中选择“新建任务” 在弹出的对话框中,输入您想要运行的程序的名称。如果您不确定程序的确切名称,可以点击“浏览”来找到…...
用 Python 实现井字棋游戏
一、引言 井字棋(Tic-Tac-Toe)是一款经典的两人棋类游戏。在这个游戏中,玩家轮流在 3x3 的棋盘上放置自己的标记,通常是 “X” 和 “O”,第一个在棋盘上连成一线(横、竖或斜)的玩家即为获胜者。…...
06 实现自定义AXI DMA驱动
为什么要实现自定义AXI DMA驱动 ZYNQ 的 AXI DMA 在 Direct Register DMA (即 Simple DMA)模式下可以通过 AXIS 总线的 tlast 提前结束传输,同时还可以在 BUFFLEN 寄存器中读取到实际传输的字节数,但是通过 Linux 的 DMA 驱动框架…...
SpringBoot集成ENC对配置文件进行加密
在线MD5生成工具 配置文件加密,集成ENC 引入POM依赖 <!-- ENC配置文件加密 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.1.2</ver…...
初学stm32 ——— 串口通信
目录 STM32的串口通信接口 UART异步通信方式特点: 串口通信过程 STM32串口异步通信需要定义的参数: USART框图: 常用的串口相关寄存器 串口操作相关库函数 编辑 串口配置的一般步骤 STM32的串口通信接口 UART:通用异步收发器USART&am…...
qwt 多Y轴 项目效果
项目场景: 在做一个半导体上位机软件项目实践中,需要做一个曲线展示和分析界面,上位机主题是用qt框架来开发,考虑到目前qt框架的两种图标库,一个是qcustomplot 一个是 qwt。之所以采用qwt ,根本原因是因为…...
Java中通过ArrayList扩展数组
在Java中,ArrayList 是一个动态数组实现,能够根据需要自动调整其大小。与传统的数组不同,ArrayList 不需要预先指定大小,并且提供了许多方便的方法来操作集合中的元素。下面将详细介绍如何使用 ArrayList 进行数组的扩展ÿ…...
Java:链接redis报错:NoSuchElementException: Unable to validate object
目录 前言报错信息排查1、确认redis密码设置是否有效2、确认程序配置文件,是否配置了正确的redis登录密码3、检测是否是redis持久化的问题4、确认程序读取到的redis密码没有乱码 原因解决 前言 一个已经上线的项目,生产环境的redis居然没有设置密码&…...
datasets库之load_dataset
目录 问题解决方案 问题 使用peft用lora微调blip2时用到了一个足球数据集,如下: 原始代码如下 dataset load_dataset("ybelkada/football-dataset", split"train")然而这需要梯子才能下载,服务器较难用VPN所以使用au…...
React Router常见面试题目
1. React Router 支持哪几种模式? React Router 支持以下两种主要模式: BrowserRouter (基于 HTML5 History API 的模式) 原理: 利用 history.pushState 和 history.replaceState 操作浏览器历史栈,无需重新加载页面。URL 看起来像传统 URL…...
sequelize-cli 封装登录接口
node ORM (sequelize)使用、查询、验证及express 基础框架的搭建及实例的使用 一、思路 第一步:肯定是用户要向接口传递邮箱、账号和密码了。 第二步:接口这边,先要验证。因为这里不是往数据库里存储数据,…...
使用 Elasticsearch 查询和数据同步的实现方法
在开发过程中,将数据从数据库同步到 Elasticsearch (ES) 是常见的需求之一。本文将重点介绍如何通过 Python 脚本将数据库中的数据插入或更新到 Elasticsearch,并基于多字段的唯一性来判断是否执行插入或更新操作。此外,我们还将深入探讨如何…...
QTday1作业设置简易登录界面
代码 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//创建一个标签QLabel *lab1 new QLabel(this);//重新设置大小lab1->resize(1925,1080);//用动图类QMovie实例化一个动图QMovie *mv new QMovie("C:\\Users\\MR\\Deskto…...
3大核心功能打造智能游戏体验:League-Toolkit从入门到精通指南
3大核心功能打造智能游戏体验:League-Toolkit从入门到精通指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League…...
中小企业SEO推广应该投入多少费用
<h2>中小企业SEO推广应该投入多少费用</h2> <p>在数字化时代,网络已经成为企业推广和销售的重要渠道之一。特别是对于中小企业来说,通过优化搜索引擎(SEO)来提升网站的自然流量,是非常有效且相对经济…...
百川2-13B模型API调用详解:从Python安装到第一个成功请求
百川2-13B模型API调用详解:从Python安装到第一个成功请求 你是不是也对大模型API调用感到好奇,但一看到那些技术文档就头疼?别担心,今天咱们就来手把手走一遍,从零开始,用最简单的Python代码,完…...
突破平台限制:res-downloader高效捕获网络资源的全方位解决方案
突破平台限制:res-downloader高效捕获网络资源的全方位解决方案 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在…...
别再为GPU发愁了!手把手教你用Kaggle免费GPU跑YOLOv7(附完整避坑清单)
零成本玩转YOLOv7:Kaggle GPU资源深度优化指南 当我在大学实验室第一次尝试训练YOLOv7模型时,那台老旧的GTX 1060显卡发出的轰鸣声至今难忘。36小时后,它终于完成了1/3的训练进度——这个经历让我深刻理解到,对于大多数个人开发者…...
【模糊PID主动悬架模型】 采用模糊PID控制的二自由度(1/4)主动悬架模型,可以自适应调整...
【模糊PID主动悬架模型】采用模糊PID控制的二自由度(1/4)主动悬架模型,可以自适应调整PID的参数,以悬架动挠度为控制目标,输入为C级随机路面激励,输出为车身垂向加速度、轮胎动载荷、悬架动挠度等平顺性评价…...
避开Verilog数据转换的坑:ASCII码转16进制时,大小写处理你真的做对了吗?
Verilog字符转换实战:如何正确处理ASCII与十六进制的大小写问题 在数字系统设计中,数据格式转换是最基础却又最容易出错的环节之一。最近在review团队一位新成员的UART通信模块代码时,发现一个典型的"大小写陷阱"——当十六进制数据…...
minikeyvalue架构解密:为什么它比SeaweedFS更简单高效?
minikeyvalue架构解密:为什么它比SeaweedFS更简单高效? 【免费下载链接】minikeyvalue A distributed key value store in under 1000 lines. Used in production at comma.ai 项目地址: https://gitcode.com/gh_mirrors/mi/minikeyvalue minikey…...
Hitboxer终极指南:免费开源SOCD清洁工具让游戏操作更丝滑
Hitboxer终极指南:免费开源SOCD清洁工具让游戏操作更丝滑 【免费下载链接】socd SOCD cleaner tool for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 还在为游戏中的方向冲突而烦恼吗?当你在激烈的对战中同时按下左右方向键&a…...
微信小程序语音交互实战:长按录制与点击播放的完整实现方案
1. 微信小程序语音交互功能概述 语音交互已经成为现代移动应用不可或缺的功能之一。在微信小程序中实现语音录制与播放,能够极大提升用户体验,特别适合社交、教育、工具类小程序。我最近在一个社交类小程序项目中实现了完整的语音交互模块,踩…...
