首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【架构师(第一篇)】整体需求分析和架构设计
2
【架构师(第二篇)】脚手架架构设计和框架搭建
3
【架构师(第三篇)】脚手架开发之掌握Lerna操作流程
4
【架构师(第四篇)】脚手架开发之Lerna源码分析
5
【架构师(第五篇)】脚手架之import-local执行流程及简历设计
6
【架构师(第六篇)】脚手架之需求分析和架构设计
7
【架构师(第七篇)】脚手架之准备阶段编写
8
【架构师(第八篇)】脚手架之 commander 框架使用方法
9
【架构师(第九篇)】如何让 Node 环境支持 ES Module
10
【架构师(第十篇)】脚手架之注册命令及架构优化
11
【架构师(第十一篇)】脚手架之命令注册和执行过程开发
12
【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法
13
【架构师(第十三篇)】脚手架之创建项目准备阶段开发
14
【架构师(第十四篇)】脚手架之 egg.js 和 mongodb 的使用
15
【架构师(第十五篇)】脚手架之创建项目模板开发
16
【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
17
【架构师(第十七篇)】脚手架之 ejs 和 glob 的使用
18
【架构师(第十八篇)】脚手架之项目模板的安装
19
【架构师(第十九篇)】脚手架之组件库模板开发
20
【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
21
【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
22
【架构师(第二十二篇)】编辑器开发之项目整体搭建
23
【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
24
【架构师(第二十四篇)】编辑器开发之添加模版到画布
25
【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
26
【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
27
【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
28
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
29
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
30
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
31
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
32
【架构师(第三十二篇)】 通用上传组件开发及测试用例
33
【架构师(第三十三篇)】 Vue 中的实例及本地图片预览
34
【架构师(第三十四篇)】 业务组件库开发之 vue3 的插件系统
35
【架构师(第三十五篇)】 业务组件库开发之使用 Rollup 进行打包
36
【架构师(第三十六篇)】 业务组件库开发之发布到 NPM
37
【架构师(第三十七篇)】 服务端开发之后端框架与数据库技术选型
38
【架构师(第三十八篇)】 服务端开发之本地安装最新版 MySQL 数据库
39
【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库
40
【架构师(第四十篇)】 服务端开发之连接 Mongodb 数据库
41
【架构师(第四十一篇)】 服务端开发之安装并连接 Redis数据库
42
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
43
【架构师(第四十三篇)】 服务端开发之单元测试和接口测试
44
【架构师(第四十四篇)】 服务端开发之 pm2 和 nginx 介绍
45
【架构师(第四十五篇)】 服务端开发之认识 Github actions
46
【架构师(第四十六篇)】 服务端开发之安装 Docker
47
【架构师(第四十七篇)】 服务端开发之认识 Docker
48
【架构师(第四十八篇)】 服务端开发之 Dockerfile
49
【架构师(第四十九篇)】 服务端开发之认识 Docker-compose
50
【架构师(第五十篇)】 服务端开发之自动发布到测试机
清单首页架构文章详情

【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法


Vue-Test-Utils 简介

提供特定的方法,在隔离的环境下,进行组件的挂载,以及一系列的测试

安装

这是一个基于 vue-cli 生成的项目,可以直接使用 vue add xxx 进行插件的安装。

代码语言:javascript
复制
vue add unit-jest

插件运作的过程

  • 安装的依赖
    • vue-test-utils
    • vue-jest
    • 注入了新的命令
  • vue-cli-service test:unit
    • tests/unit 目录下以 .spec.(js|jsx|ts|tsx) 结尾的文件
    • __test__ 目录下的文件
  • vue-jest 转换
    • vue SFC 格式的文件转化为对应的 Ts 文件
    • Ts 文件通过 presets/typescript-babel 转换成对应的 Js 文件

基础语法

开始测试

执行命令

代码语言:javascript
复制
npm run test:unit -- --watchAll

控制台实时显示测试结果

语法内容

  • 渲染组件
    • mountshallowMount
    • 传递属性
  • 元素是否成功的显示
    • 查找元素的不同写法
    • getfind
    • findComponentgetComponent
    • findAllfindAllComponents

测试所需组件

父组件

代码语言:javascript
复制
<template>
  <div>
    <h1>{{ msg }}</h1>
    <button class="add-count"
            @click="addCount">{{ count }}</button>
    <hello-com msg="1234"></hello-com>
  </div>
</template>

<script setup lang="ts">
import { defineProps, ref } from 'vue'
import HelloCom from './hello.vue'

defineProps({
  msg: String
})

const count = ref(0)
const addCount = () => {
  count.value++
}
</script>

子组件

代码语言:javascript
复制
<template>
  <h1>{{ msg }}</h1>
</template>

<script setup lang="ts">
import { defineProps } from 'vue'
const props = defineProps({
  msg: String
})
</script>

mount 和 shallowMount

使用 mount

代码语言:javascript
复制
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = mount(HelloWorld, {
      props: { msg },
    });
    // 打印 html 结构
    console.log(wrapper.html());
  });
});

使用 shallowMount

代码语言:javascript
复制
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = shallowMount(HelloWorld, {
      props: { msg },
    });
    // 打印 html 结构
    console.log(wrapper.html());
  });
});

可以看到 mountshallowMount 的区别就是 mount 会打印出完整的 html 结构,而 shallowMount 将子组件以标签的形式打印。

得到的结论是

  • mount 一股脑全部渲染
  • shallowMount 只渲染组件本身,子组件不渲染
  • shallowMount 将其他组件隔离,更适合单元测试

find 和 get

代码语言:javascript
复制
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = shallowMount(HelloWorld, {
      props: { msg },
    });
    // 使用 get
    console.log(wrapper.get('h1').text());
    // 使用 find
    console.log(wrapper.find('h1').text());
  });
});

当元素存在的时候,findget 是一样的。

当元素不存在的时候,get 会报错,并导致单元测试失败。

代码语言:javascript
复制
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = shallowMount(HelloWorld, {
      props: { msg },
    });
    // 使用 get
    console.log(wrapper.get('h2'));
  });
});

当元素不存在的时候,find 不会报错,并不会导致单元测试失败。

代码语言:javascript
复制
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = shallowMount(HelloWorld, {
      props: { msg },
    });
    // 使用 find
    console.log(wrapper.find('h2'));
  });
});

得到的结论是

  • 找不到元素的时候,find 会返回 null 不会报错,case 通过,get 会报错,case 失败。
  • 总是使用 get ,除非想要判断一些元素不存在的时候,使用 find

findComponent 和 getComponent

代码语言:javascript
复制
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = shallowMount(HelloWorld, {
      props: { msg },
    });
    // 使用 findComponent
    console.log(wrapper.findComponent(HelloCom));
    // 使用 getComponent
    console.log(wrapper.getComponent(HelloCom));
  });
});

当组件存在时,findComponentgetComponent 的结果是一样的。

当组件不存在时,findComponent 不会报错。

代码语言:javascript
复制
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = shallowMount(HelloWorld, {
      props: { msg },
    });
    console.log(wrapper.findComponent({ name: 'foo' }));
  });
});

当组件不存在时,getComponent 会报错。

代码语言:javascript
复制
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = shallowMount(HelloWorld, {
      props: { msg },
    });
    console.log(wrapper.getComponent({ name: 'foo' }));
  });
});

得到的结论是

  • 找不到组件的时候,findComponent 会返回 null 不会报错,case 通过,getComponent 会报错,case 失败。
  • 总是使用 getComponent ,除非想要判断一些元素不存在的时候,使用 findComponent
  • 只需要判断是否渲染了子组件,传递了正确的属性,不必测试子组件中的内容,这就是单元测试的意义,独立,互不影响。

findAll 和 findAllComponents

代码语言:javascript
复制
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = shallowMount(HelloWorld, {
      props: { msg },
    });
    console.log(wrapper.findAll('h1'));
  });
});

findAll 返回元素的 DOMWrapper 数组,如果没有,返回空数组。

代码语言:javascript
复制
describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'new message';
    const wrapper = shallowMount(HelloWorld, {
      props: { msg },
    });
    console.log(wrapper.findAllComponents(HelloCom));
  });
});

findAllComponents 返回组件 vueWrapper 的数组,如果没有,返回空数组。

下一篇
举报
领券