Vue 2 项目中快速集成 Jest 单元测试(超详细教程)

在 Vue 项目中编写单元测试,是提升代码质量和维护性的关键一步。本文将带你从零开始,在一个 Vue 2 + Vue CLI 项目中集成 Jest 作为单元测试框架,并运行第一个测试用例。

✅ 适用于 Vue 2 项目(如你使用的是 vue-cli-service)

✅ 基于 @vue/cli-plugin-unit-jest 官方插件

✅ 包含完整命令、配置说明和测试示例

一、安装 Jest 及相关依赖
如果你的项目已经使用 Vue CLI 创建,只需添加官方的 Jest 插件即可。

1. 安装 Jest 插件

vue add @vue/unit-jest


⚠️ 注意:这个命令会自动安装 @vue/cli-plugin-unit-jest 和 @vue/test-utils 等必要依赖。

二、检查 package.json 脚本
确保你的 package.json 中有以下脚本:

"scripts": {"test:unit": "vue-cli-service test:unit","test": "jest","test:watch": "jest --watch","test:coverage": "jest --coverage"
}
  • npm run test:unit:使用 Vue CLI 运行测试(推荐)
  • npm run test:直接运行 Jest(适合 CI)
  • --watch:监听文件变化
  • --coverage:生成测试覆盖率报告

三、创建第一个测试文件
假设你有一个组件:src/components/HelloWorld.vue

1. 创建测试文件
在 tests/unit/ 目录下创建 HelloWorld.spec.js:

// tests/unit/HelloWorld.spec.js
import { shallowMount } from '@vue/test-utils'
import HelloWorld from '@/components/HelloWorld.vue'describe('HelloWorld.vue', () => {it('renders props.msg when passed', () => {const msg = 'Welcome to Jest Testing'const wrapper = shallowMount(HelloWorld, {propsData: { msg }})expect(wrapper.text()).toMatch(msg)})
})

四、运行测试

1. 运行所有测试

npm run test:unit

或使用 Jest 命令:

npm run test

2. 查看测试覆盖率

npm run test:coverage

运行后会在项目根目录生成 coverage/ 文件夹,打开 coverage/lcov-report/index.html 可查看详细报告。

五、Jest 配置(可选)

Jest 的配置默认由 Vue CLI 管理,你也可以在 package.json 中添加 jest 字段进行自定义:

"jest": {"testMatch": ["**/tests/unit/**/*.spec.(js|jsx|ts|tsx)"],"moduleFileExtensions": ["js","json","vue"],"transform": {"^.+\\.js$": "babel-jest",".*\\.(vue)$": "vue-jest"},"testEnvironment": "jsdom","setupFiles": ["<rootDir>/tests/setup.js"]
}

创建 setup.js(处理 DOM 操作)
有些组件会操作 document,在测试中可能报错(如 querySelector is null),可创建 tests/setup.js:

// tests/setup.js
if (typeof document !== 'undefined') {if (!document.body) {document.body = document.createElement('body')}
}

并在 jest 配置中引入。

六、常见问题解决

问题解决方案
document is not defined 确保 testEnvironment: "jsdom"
Unexpected token 'export' 检查 babel.config.js 是否正确
Test suite failed to run安装 vue-jest@^3.0.7 和 babel-jest
TypeError: Cannot read property 'classList' of null 在操作 DOM 前加 if (el) 判断

七、推荐最佳实践

  • 测试文件命名:xxx.spec.js 或 xxx.test.js
  • 测试文件位置:src同级创建 tests文件夹 或者在测试的源码同级目录添加
  • 使用 shallowMount:避免渲染子组件
  • mock 接口请求:避免真实网络调用
  • 覆盖核心逻辑:props、events、computed、methods

八、遇到的问题

1. [vue-jest]: Less are not currently compiled by vue-jest

这个报错大模型回答受限于vue2,所以解决不掉,有解决办法烦请共享下

2. TypeError: Cannot read property 'createElement' of null

报错信息

问题定位

耗费大量时间排查之后发现是因为代码中在created()调用了getModelList()这个接口请求的方法导致报错读不到createElement和worker process得问题

原因分析

大模型回答如下

解决方案

mock接口请求并document.querySelector(不然会在调用此方法时报错报错)

总结

步骤 命令
安装 Jestvue add @vue/unit-jest
运行测试 npm run test:unit
查看覆盖率 npm run test:coverage
编写测试 tests/unit/*.spec.js

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94154.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL15——管理表空间

管理表空间一、基本概念二、创建表空间三、修改表空间四、删除表空间一、基本概念 在 PostgreSQL 中&#xff0c;它是通过表空间&#xff08;Tablespaces&#xff09;来实现逻辑对象&#xff08;表、索引等&#xff09;与物理文件之间的映射。创建数据库或者数据表&#xff08…

趣打印高级版--手机打印软件!软件支持多种不同的连接方式,打印神器有这一个就够了!

软件介绍&#xff08;文末获取&#xff09;趣打印高级版是一款手机打印软件。软件支持五种不同的连接方式&#xff0c;每种都有稳定且快速的反应&#xff0c;用户均可通过手机进行打印机的远程使用和设置。软件还支持上传不同格式的文档类型进行打印&#xff0c;方便快捷&#…

【开源框架】7 款流行的 Vue 3 后台管理框架对比

以下是 7 个流行的 Vue 3 后台管理框架在 Star 数&#xff08;截至 2025 年 8 月21日的 GitHub 最新数据&#xff09;、框架特点、基于的技术栈及开源协议四个方面的详细对比&#xff1a; 1. Vue-Vben-Admin GitHub 地址&#xff1a;https://github.com/vbenjs/vue-vben-admin…

Datawhale工作流自动化平台n8n入门教程(一):n8n简介与平台部署

前言 在数字化时代&#xff0c;重复性的工作任务正在消耗着我们大量的时间和精力。从数据同步到营销自动化&#xff0c;从客户服务到内容管理&#xff0c;这些琐碎但必要的任务往往让我们疲于应对。而工作流自动化工具的出现&#xff0c;为我们提供了一个优雅的解决方案。 今天…

SRE - 定位与能力

仅为个人知识总结与记录 Site Reliability Engineer&#xff1a;站点可靠性工程&#xff08;SRE 软件工程师 运维专家 可靠性专家&#xff09; 相对传统的运维工程师&#xff0c;SER 注重开发&#xff0c;效率&#xff0c;追求自动化。对于 SRE 工程师&#xff0c;追究的就是…

StarRocks学习4-查询优化与性能调优

✅ 1. 执行计划分析&#xff08;EXPLAIN&#xff09; &#x1f31f; 作用&#xff1a; 用于查看 SQL 的执行路径&#xff0c;判断是否命中索引、物化视图、Join 策略、并行度等。 &#x1f4cc; 常用命令&#xff1a; EXPLAIN SELECT ...; EXPLAIN VERBOSE SELECT ...;&#x1…

CentOS系统安装Git全攻略

文章目录✅ 方法一&#xff1a;使用 yum 或 dnf 包管理器安装&#xff08;推荐&#xff09;1. 更新系统软件包(非必须)[^1]2. 安装 Git3. 验证安装✅ 方法二&#xff1a;从源码编译安装&#xff08;适用于需要自定义版本或配置&#xff09;1. 安装依赖包2. 下载 Git 源码3. 编译…

VR交通安全学习机-VR交通普法体验馆方案

VR交通安全学习机是一种基于虚拟现实技术的互动式教育设备&#xff0c;旨在通过虚拟环境模拟真实的交通场景&#xff0c;帮助用户深入了解交通规则、交通信号、道路安全等知识&#xff0c;并通过沉浸式的体验让他们亲身感受到不遵守交通规则的后果。无论是驾驶员、行人还是骑行…

算法题(188):团伙

审题&#xff1a; 本题需要我们通过解析所有人之间的关系&#xff0c;从而判断出朋友团体的总个数并输出 思路&#xff1a; 方法一&#xff1a;扩展域并查集 由于这里涉及对朋友/敌人等关系集合的频繁操作&#xff0c;所以我们需要使用并查集来操作&#xff0c;但是普通的并查集…

C++开发/Qt开发:单例模式介绍与应用

单例模式是软件设计模式中最简单也是最常用的一种创建型设计模式。它的核心目标是确保一个类在整个应用程序生命周期中只有一个实例&#xff0c;并提供一个全局访问点。笔者白话版理解&#xff1a;你创建了一个类&#xff0c;如果你希望这个类对象在工程中应用时只创建一次&…

Linux笔记---策略模式与日志

1. 设计模式设计模式是软件开发中反复出现的问题的通用解决方案&#xff0c;它是一套套被反复使用、多数人知晓、经过分类编目的代码设计经验总结。设计模式并非具体的代码实现&#xff0c;而是针对特定问题的抽象设计思路和方法论。它描述了在特定场景下&#xff0c;如何组织类…

关于多个el-input的自动聚焦,每输入完一个el-input,自动聚焦到下一个

讲解原理或者思路&#xff1a;如果你有多个el-input,想要实现每输入完一个输入框&#xff0c;然后自动聚焦到下一个输入框&#xff0c;同理&#xff0c;如果每删除一个输入框的值&#xff0c;自动聚焦到上一个输入框。条件那么首先要做的就是&#xff0c;设置条件&#xff0c;在…

AI 赋能教育变革:机遇、实践与展望

引言说明教育在社会发展中的重要地位&#xff0c;以及传统教育面临的困境。引出 AI 技术为教育变革带来新机遇&#xff0c;阐述研究其在教育中应用的价值。AI 为教育带来的机遇个性化学习支持&#xff1a;讲解 AI 通过分析学生学习数据&#xff0c;如答题情况、学习时间等&…

(一)八股(数据库/MQ/缓存)

文章目录 项目地址 一、数据库 1.1 事务隔离级别 1. 事务的四大特性 2. Read Uncommited脏读(未提交读) 3. Read Commited幻读(sql默认已提交读) 4. Repeatable Read 5. Serializable 6. Snapshot(快照隔离) 7. 代码开启 8. For update和Repeatable Read的区别 1.2 各种锁 …

STM32H750 CoreMark跑分测试

STM32H750 CoreMark跑分测试&#x1f50e;CoreMark跑分测试查询网站&#xff1a;https://www.eembc.org/coremark/scores.php&#x1f4dc; CoreMark源码&#xff1a;https://www.github.com/eembc/coremarkCoreMark移植和配置参考&#xff1a;https://community.st.com/t5/stm…

RabbitMQ如何确保消息发送和消息接收

消息发送确认 1 ConfirmCallback方法 ConfirmCallback 是一个回调接口&#xff0c;消息发送到 Broker 后触发回调&#xff0c;确认消息是否到达 Broker 服务器&#xff0c;也就是只 确认是否正确到达 Exchange 中。 2 ReturnCallback方法 通过实现 ReturnCallback 接口&#xf…

Linux:进程间通信-管道

Linux&#xff1a;进程间通信-管道 前言&#xff1a;为什么需要进程间通信&#xff1f; 你有没有想过&#xff0c;当你在电脑上同时打开浏览器、音乐播放器和文档时&#xff0c;这些程序是如何协同工作的&#xff1f;比如&#xff0c;浏览器下载的文件&#xff0c;为什么能被文…

Jmeter + FFmpeg 直播压测遇到的问题及解决方案

1、压测机安装FFmpeg&#xff0c;下载安装步骤可见&#xff1a;https://zhuanlan.zhihu.com/p/692019886 2、Jmeter与FFmpeg位数要一致&#xff0c;不允许在32位的进程中运行一个64位的程序&#xff0c;反之亦然 3、OS进程取样器&#xff08;Thread Group -> Add -> Sa…

安卓app、微信小程序等访问多个api时等待提示调用与关闭问题

安卓app、微信小程序访问webapi&#xff0c;将需要一时间&#xff0c;我们称之为耗时操作&#xff0c;其它诸如密集型计算、访问文件与设备等亦是如此。在这个期间我们应该跳出提示&#xff0c;告知用户正在等待&#xff0c;并且很多时候&#xff0c;在等待时不允许用户再对UI进…

一个状态机如何启动/停止另一个状态机

一个状态机如何启动/停止另一个状态机 这个过程主要依赖于动作列表&#xff08;Action List&#xff09; 中的特定动作项和状态管理服务&#xff08;ARA::SM&#xff09;提供的API。 1. 通过动作列表&#xff08;Action List&#xff09;进行预配置控制 这是最常见的方式&#…