安装

第一步

方法二:(推荐)
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 文件

方法二:(只是想记录安装时的错误),适合不适用vue cli时用
yarn add @vue/cli-plugin-unit-jest vue-jest @vue/test-utils @vue/vue3-jest ts-jest
image.png
报以上的错误时,安装babel-jest,且必须大于27以上。

第二步

新建jest.config.js

  1. module.exports = {
  2. preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel',
  3. }

第三步

修改package.json

  1. "scripts": {
  2. ...
  3. "test:unit": "vue-cli-service test:unit",
  4. },

运行 yarn test:unit (使用—watchAll 会报错 语法会自动的坚持所有测试文件)
image.png

语法内容

  • 渲染组件
    • mount 和 shallowMount
      • 区别:
        • mount:全部渲染
        • shallowMount 只渲染组件本身,外来的子组件不渲染
        • shallowMount 更快,更适合单元测试
    • 传递属性
  • 元素是否成功的显示
    • 查找元素的不同写法
    • get,find
      • find找不到的时候返回null,case不会出错
      • get throw错误,case报错
      • 推荐get,除了像判断一些元素不存在的时候,这种情况使用find
    • findAllComponent,findAll
    • findComponent,getComponent
      • getComponent 不必测试子组件里面的内容,只要判断渲染子组件,是否传递了正确的属性即可

        mount 和 shallowMount

        ```vue

  1. ```vue
  2. <template>
  3. <div>
  4. <h1>{{ msg }}</h1>
  5. <button class="add-count" @click="addCount">{{ count }}</button>
  6. <hello msg="1234"></hello>
  7. </div>
  8. </template>
  9. <script lang="ts">
  10. import { defineComponent, ref } from 'vue'
  11. import Hello from './hello.vue'
  12. export default defineComponent({
  13. name: 'hello-world',
  14. components: {
  15. Hello,
  16. },
  17. props: {
  18. msg: {
  19. type: String,
  20. },
  21. },
  22. setup(props) {
  23. const count = ref(0)
  24. const addCount = () => {
  25. count.value++
  26. }
  27. return {
  28. count,
  29. addCount,
  30. msg: props.msg,
  31. }
  32. },
  33. })
  34. </script>

使用shallowMount时

  1. import { shallowMount, mount } from '@vue/test-utils'
  2. import HelloWorld from '@/components/HelloWorld.vue'
  3. import hello from '@/components/hello.vue'
  4. describe('HelloWorld.vue', () => {
  5. it('renders props.msg when passed', () => {
  6. const msg = 'new message'
  7. const wrapper = shallowMount(HelloWorld, {
  8. props: { msg },
  9. })
  10. // 打印 html 结构
  11. console.log(wrapper.html())
  12. })
  13. })

image.png
修改.toMatch(‘1’)时
image.png

使用mount时

  1. import { shallowMount, mount } from '@vue/test-utils'
  2. import HelloWorld from '@/components/HelloWorld.vue'
  3. import hello from '@/components/hello.vue'
  4. describe('HelloWorld.vue', () => {
  5. it('renders props.msg when passed', () => {
  6. const msg = 'new message'
  7. const wrapper = mount(HelloWorld, {
  8. props: { msg },
  9. })
  10. // 打印 html 结构
  11. console.log(wrapper.html())
  12. })
  13. })

image.png

find和get

元素存在时

  1. import { shallowMount, mount } from '@vue/test-utils'
  2. import HelloWorld from '@/components/HelloWorld.vue'
  3. describe('HelloWorld.vue', () => {
  4. ...
  5. // 使用 get
  6. console.log(wrapper.get('h1').text())
  7. // 使用 find
  8. console.log(wrapper.find('h1').text())
  9. })

image.png

元素不存在

get,报错,抛出异常

console.log(wrapper.get('h2'))
image.png

find,测试通过

console.log(wrapper.get('h2'))
image.png

findAll与findAllComponent

findAll

console.log(wrapper.findAll('h1'))
findAll 返回元素的 DOMWrapper 数组,如果没有,返回空数组。
image.png

findAllComponents

wrapper.findAllComponents(hello)
findAllComponents 返回组件 vueWrapper 的数组,如果没有,返回空数组。
image.png

findComponent 和 getComponent

findComponent

console.log(wrapper.findComponent(HelloWorld).props())
image.png