vitest单元测试配合@vue/test-utils之组件单元测试篇

what is vitest & test-utils

vitest 是由 vite 提供支持的极速单元测试框架,VueTestUtils 是 Vue.js 的官方测试实用程序库,vitest 本身是不支持单元组件测试的,需要配合 test-utils 来完成组件单元测试,安装与基本 API 就不再赘述,学会阅读文档与查找资料是一个程序员的基本功

demo

/* Component */
<template>
  <div>
    <div class="test-utils-value">值为:{{ num }}</div>
    <button class="test-utils-button" @click="increment">测试按钮</button>
  </div>
</template>

<script setup lang="ts">
  import { ref } from 'vue'
  import type { Ref } from 'vue'
  const num: Ref<number> = ref(1)
  function increment() {
    num.value++
  }
</script>
// spec | test
import { describe, it, expect } from 'vitest'
import { shallowMount } from '@vue/test-utils'
import AddNum from '@/views/AddNum.vue'

describe('组件单元测试', () => {
  it('test1', async () => {
    const wrapper = shallowMount(AddNum)
    const btn = '.test-utils-button'
    const value = '.test-utils-value'
    expect(wrapper.find(value).text()).toContain('值为:1')
    await wrapper.find(btn).trigger('click')
    expect(wrapper.find(value).text()).toBe('值为:2')
  })
})
  1. demo 由一个组件和测试文件组成
  2. 组件的逻辑非常简单,按下按钮则数字+1,页面显示实时数字
  3. 测试代码中使用 test-utils 库的 shallowMount 方法浅渲染挂载组件(*:浅渲染只渲染当前组件,不会渲染它的子组件,从而避免在测试中与子组件的行为产生干扰)
  • 组件通过 find 方法返回查找元素,再通过 text 方法返回元素的文本内容
  • 然后使用 vitest 库的 expect 创建断言,toContain 是断言检查值是否在数组中,toBe 是断言基础对象是否相等
  • trigger 是 test-utils 中触发 DOM 事件的方法,demo 中触发了点击事件,模拟用户按下了按钮的操作,按下按钮前后都断言了,会判断实际执行结果与预期结果是否一致,如果不一致则会抛出错误
  • 如将tobe('值为:2')改为tobe('值为:3'),就会提示哪一个测试文件中的哪一个测试用例失败,并展示错误的预期值和实际的执行结果
- Expected   "值为:3"
+ Received   "值为:2"

tips

虽然这是一个非常简单 demo,但它还是有很多值得注意的知识点的

  • describe 可以在文件顶层直接使用testbench,它们会被收集为隐式套件的一部分,也可以用describe在当前上下文定义一个新套件,作为一组相关的测试或嵌套套件
  • it ittest的别名,使用ittest都是可以的
  • shallowMount 按照文档描述它是使用挂载组件的别名,所以也可以使用mount(Component, { shallow: true })来浅渲染挂载组件,shallow 的默认值是 false
  • async/await 可以看到 trigger 前使用了 await,这与我们寻常使用 async/await 有一点细微的差别,假如我们去掉 async/await,测试用例将会失败,因为按钮虽然按下了,值也自增了,但 vue 不会立即更新 DOM,而是等到下一个事件循环勾选之后再更新,所以断言会在在 vue 更新之前被调用,拿到的实际执行结果还是初始值 1,与预期值 2 不符,然后抛出错误,这感觉是不是很熟悉,这不就像 Vue 的异步更新策略导致我们对数据的修改不会立马体现到页面变化上,此时如果想要立即获取更新后的 dom 的状态,我们就需要使用到…对,没错就是我们的老朋友nexttick()
import { nextTick } from 'vue'

it('test1', async () => {
  const wrapper = shallowMount(AddNum)
  const btn = '.test-utils-button'
  const value = '.test-utils-value'
  expect(wrapper.find(value).text()).toContain('值为:1')
  wrapper.find(btn).trigger('click')
  await nexttick()
  expect(wrapper.find(value).text()).toBe('值为:2')
})

因为这是很常见的一个问题,test-utils提供了一个快捷方式,可以直接在await后跟触发DOM的事件,省略掉nexttick(),即await wrapper.find(btn).trigger('click'),如此一来我们断言的实际结果就是自增过后的数字,与预期结果相符,测试用例通过

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误是因为在当前项目中缺少 "@vue/cli-shared-utils" 模块。 要解决这个问题,可以尝试以下几个步骤: 1. 确认你的项目中是否已经安装了 "@vue/cli-shared-utils"。你可以在项目根目录下运行命令 "npm ls @vue/cli-shared-utils" 来检查。如果没有安装,你可以尝试运行 "npm install @vue/cli-shared-utils" 来安装它。 2. 如果 "@vue/cli-shared-utils" 已经安装,那么可能是版本不兼容导致的问题。你可以尝试更新 "@vue/cli-shared-utils" 到最新版本,或者回退到一个已知可用的版本。可以在 package.json 文件中修改 "@vue/cli-shared-utils" 的版本号,然后再运行 "npm install" 命令来安装或更新模块。 3. 如果以上方法都不行,可能是因为你的项目环境没有正确配置。你可以尝试重新安装或配置你的项目环境,或者创建一个新的项目来测试。 ### 回答2: 在使用Vue开发应用程序时,有时会出现错误提示“error: cannot find module '@vue/cli-shared-utils'”这个错误信息,这个错误通常出现在使用Vue CLI命令时。 出现这个错误消息的原因可能是以下几种情况: 1、Vue CLI版本过低或者没有安装。如果您的Vue CLI版本过低,或者没有安装Vue CLI,那么会导致无法找到模块的问题。 2、您的项目缺少依赖。如果您的项目缺少依赖,比如缺少@vue/cli-shared-utils的模块,那么就会出现找不到模块的错误。 3、您的本地环境配置出现问题。在项目运行过程中,如果您的本地环境配置出现问题,比如系统缺少某些依赖包,那么就会导致出现找不到模块的错误提示。 解决这个错误的方法,可以根据实际情况来进行如下操作: 1、先检查一下您的Vue CLI版本是否过低,或者是否安装Vue CLI。 2、检查您的项目依赖是否缺少了一些必要的模块。可以通过运行npm install命令来安装所需的依赖。 3、如果您的环境配置出现了问题,那么可以尝试升级您的系统或重新安装依赖包。 总之,无论是出现找不到模块的错误还是其他的错误信息,在处理之前我们都需要认真分析错误的原因,然后再针对具体情况来进行解决。在开发过程中,要时刻保持警惕,做好代码备份,尽可能预防和排除错误,减少出错的次数,提高开发效率。 ### 回答3: “@vue/cli-shared-utils”是Vue CLI 4.x中的一个常用模块,用于处理CLI内部的一些工具函数和工具类。这个错误提示意味着在运行Vue CLI相关命令时,系统无法找到这个模块。 通常这个错误产生有以下可能原因: 1. 没有正确安装Vue CLI 4.x或者版本不对。如果你使用的是Vue CLI 3.x的版本,那么这个模块的路径和名称会有不同。 2. Node.js环境不匹配。某些Node.js版本不兼容Vue CLI 4.x,如果你使用的是旧版Node.js可能会导致找不到模块的错误。 3. 模块未安装或安装不完全。Vue CLI 4.x是基于模块化的设计,如果你安装了Vue CLI 4.x但未正确安装“@vue/cli-shared-utils”模块,则会出现此错误。 解决这个错误可以尝试以下步骤: 1. 检查Vue CLI版本是否正确,可以使用命令“vue --version”查看当前Vue CLI版本是否是4.x版本,如果不是则需要升级。 2. 检查Node.js版本是否正确,可以使用命令“node --version”查看当前Node.js版本是否支持Vue CLI 4.x。 3. 重新安装Vue CLI 4.x,并确保安装完成后使用“npm install”命令安装所有依赖包。 4. 如果以上步骤都没有解决问题,可以尝试将“@vue/cli-shared-utils”模块重新安装,使用“npm install @vue/cli-shared-utils”命令重新安装一遍依赖包。 总之,在解决Vue CLI中的错误时,需要考虑多个因素,包括版本、环境以及依赖包等等因素,找到问题的根源并加以解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值