重生之我在学Vue--第13天 Vue 3 单元测试实战指南

news/2025/3/17 18:21:29/

重生之我在学Vue–第13天 Vue 3 单元测试实战指南

文章目录

  • 重生之我在学Vue--第13天 Vue 3 单元测试实战指南
    • 前言
    • 一、测试环境搭建
      • 1.1 测试框架配置
      • 1.2 测试文件结构
    • 二、组件测试实战
      • 2.1 基础渲染测试
      • 2.2 事件触发测试
      • 2.3 异步操作测试
    • 三、Pinia Store测试
      • 3.1 Store初始化配置
      • 3.2 Action测试用例
      • 3.3 错误处理测试
    • 四、高级测试技巧
      • 4.1 快照测试
      • 4.2 路由状态模拟
      • 4.3 测试覆盖率优化
    • 总结

前言

“未经验证的代码如同未系安全带的飙车,测试就是程序员的主动安全系统。” —— 测试驱动开发哲学

经过12天的开发与优化,我们的任务管理系统已具备完整功能。今天我们将为项目搭建质量防护网,使用Jest+Vue Test Utils实现单元测试全覆盖。

Vue3 官方中文文档传送点: 测试指南

Vue前端成仙之路:Vue 前端成仙之路_野生的程序媛的博客-CSDN博客

GO后端成神之路:Go 后端成神之路_野生的程序媛的博客-CSDN博客

一、测试环境搭建

1.1 测试框架配置

npm install jest @vue/test-utils @types/jest vue-jest@next -D

Jest配置文件(jest.config.js):

javascript">module.exports = {preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel',testMatch: ['**/__tests__/**/*.[jt]s?(x)'],moduleNameMapper: {'^@/(.*)$': '<rootDir>/src/$1'},collectCoverage: true,coverageReporters: ['html', 'text-summary']
}

1.2 测试文件结构

src/
├─ components/
│  └─ TaskList/
│     ├─ TaskList.vue
│     └─ __tests__/
│        └─ TaskList.spec.ts
└─ store/└─ __tests__/└─ taskStore.spec.ts

二、组件测试实战

2.1 基础渲染测试

// TaskList.spec.ts
import { mount } from '@vue/test-utils'
import TaskList from '../TaskList.vue'describe('TaskList组件测试', () => {const tasks = [{ id: 1, title: '学习Vue3', completed: false },{ id: 2, title: '编写测试用例', completed: true }]test('正确渲染任务列表', () => {const wrapper = mount(TaskList, {props: { tasks }})// 验证渲染数量const items = wrapper.findAll('.task-item')expect(items.length).toBe(tasks.length)// 验证内容展示expect(wrapper.text()).toContain('学习Vue3')})
})

2.2 事件触发测试

test('正确触发删除事件', async () => {const wrapper = mount(TaskList, {props: { tasks }})// 查找第一个删除按钮并点击const deleteBtn = wrapper.find('.delete-btn')await deleteBtn.trigger('click')// 验证emit事件expect(wrapper.emitted('delete-task')).toBeTruthy()expect(wrapper.emitted('delete-task')![0]).toEqual([1])
})

2.3 异步操作测试

test('加载状态显示正确', async () => {const wrapper = mount(TaskList, {props: { tasks: [],loading: true }})expect(wrapper.find('.loading-spinner').exists()).toBe(true)
})

三、Pinia Store测试

3.1 Store初始化配置

import { setActivePinia, createPinia } from 'pinia'
import { useTaskStore } from '@/store/taskStore'beforeEach(() => {setActivePinia(createPinia())
})

3.2 Action测试用例

test('addTask添加新任务', async () => {const store = useTaskStore()const newTask = { title: '新任务' }// 模拟API请求jest.spyOn(axios, 'post').mockResolvedValue({ data: { ...newTask, id: 1 } })await store.addTask(newTask)expect(store.tasks).toHaveLength(1)expect(store.tasks[0].title).toBe('新任务')
})

3.3 错误处理测试

test('deleteTask处理网络错误', async () => {const store = useTaskStore()store.tasks = [{ id: 1, title: '待删除任务', completed: false }]// 模拟API失败jest.spyOn(axios, 'delete').mockRejectedValue(new Error('网络错误'))await expect(store.deleteTask(1)).rejects.toThrow('删除失败')expect(store.tasks).toHaveLength(1) // 确保未删除
})

四、高级测试技巧

4.1 快照测试

test('组件渲染快照', () => {const wrapper = mount(TaskList, {props: { tasks }})expect(wrapper.html()).toMatchSnapshot()
})

4.2 路由状态模拟

import { createRouter, createWebHistory } from 'vue-router'const router = createRouter({history: createWebHistory(),routes: []
})test('带路由的组件测试', async () => {const wrapper = mount(Component, {global: {plugins: [router]}})
})

4.3 测试覆盖率优化

配置package.json:

{"scripts": {"test:coverage": "jest --coverage"}
}

总结

通过今天的测试实战,我们为项目实现了:

  1. 核心组件100%覆盖率:所有关键交互均有测试保障
  2. Store层完整验证:数据流变化可追踪
  3. 错误场景全面覆盖:网络异常等边界情况妥善处理

明日预告:国际化方案落地,让应用走向世界舞台!


http://www.ppmy.cn/news/1579869.html

相关文章

IMA+DeepSeekR1+本地知识库撰写NOIP2008普及组T3【传球游戏】题解

目录 一、提问词 二、DeepSeekR1回复 题目描述 解题思路 实现代码 代码说明 三、说明 【IMADeepSeekR1本地知识库】撰写NOIP2008普及组复赛题解系列 1、IMADeepSeekR1本地知识库撰写NOIP2008普及组T1【ISBN 号码】题解-CSDN博客 2、IMADeepSeekR1本地知识库撰写NOIP200…

学习MDA规范_9.CORBA(公共对象请求代理架构)‌

‌CORBA&#xff08;公共对象请求代理架构&#xff09;‌ 是一种标准化的中间件技术&#xff0c;核心目标是实现跨编程语言、操作系统和硬件平台的分布式系统互操作。其核心价值在于‌语言无关性‌&#xff08;支持多种编程语言的对象交互&#xff09;、‌系统无关性‌&#xf…

基于Python+Flask+MySQL+HTML的爬取豆瓣电影top-250数据并进行可视化的数据可视化平台

FlaskMySQLHTML 项目采用前后端分离技术&#xff0c;包含完整的前端&#xff0c;以flask作为后端 Pyecharts、jieba进行前端图表展示 通过MySQL收集格列数据 通过Pyecharts制作数据图表 这是博主b站发布的详细讲解&#xff0c;感兴趣的可以去观看&#xff1a;【Python爬虫可…

conda的基本使用及pycharm里设置conda环境

创建conda环境 conda create --name your_env_name python3.8 把your_env_name换成实际的conda环境名称&#xff0c;python后边的根据自己的需要&#xff0c;选择python的版本。 激活conda环境 conda activate your_env_name 安装相关的包、库 conda install package_name …

《基于深度学习的高分卫星图像配准模型研发与应用》开题报告

目录 1. 选题的背景和意义 1.1 选题的背景 1.2 国内外研究现状 1.3 发展趋势 2&#xff0e;研究的基本内容 2.1 主要研究内容 &#xff08;1&#xff09;训练与测试数据集构建 &#xff08;2&#xff09;基于深度学习的高精度卫星影像配准模型 &#xff08;3&#xff0…

自动驾驶之心视觉语言导航!VLN算法与实战课程

课程地址 自动驾驶之心具身智能VLA算法与实战教程 自动驾驶之心视觉语言导航&#xff01;VLN算法与实战课程 自动驾驶之心Occupancy数据生成与模型实战教程 自动驾驶之心面向科研落地的3DGS全栈实战教程 自动驾驶之心面向自动驾驶的C实战教程(视频 答疑) 自动驾驶之心单目3D与单…

LLMs之CoD:《Chain of Draft: Thinking Faster by Writing Less》翻译与解读

LLMs之CoD&#xff1a;《Chain of Draft: Thinking Faster by Writing Less》翻译与解读 导读&#xff1a;这篇论文的核心是提出了一种名为“Chain of Draft”&#xff08;CoD&#xff0c;草稿链&#xff09;的新型提示策略&#xff0c;用于改进大型语言模型&#xff08;LLMs&a…

day04_Java高级

文章目录 day04_Java高级一、今日课程内容二、可变参数三、Java的集合1、单列集合1.1 List集合1.2 常见的数据结构(了解)1.3 Set集合1.4 哈希表 2、双列集合3、Collections集合工具类 四、&#xff08;掌握&#xff09;Lambda表达式1、体验Lambda表达式2、Lambda表达式的标准格…