[Day21] Vue 3 单元测试 (Unit Testing) - Props & Computed

PropsComputed 是开发元件最常使用的属性,下面的范例是一个运用 Props 与 Computed 的简单例子。

import { ref, computed } from 'vue'

const Component = {
  template: `
    <div>
      <input data-test="password" v-model="password">
      <p v-if="showError && isError" data-test="errorMsg">Password must be at least {{minLength}} characters.</p>
    </div>
  `,
  props: {
    minLength: {
      type: Number,
      required: true
    },
    showError: {
      type: Boolean,
      default: true
    }
  },
  setup (props) {
    const password = ref('')
    const isError = computed(() => password.value.length < props.minLength)

    return {
      isError,
      password
    }
  }
}

元件中有一个输入框可以输入密码,而密码会有一个最短的长度限制 (minLength),预设的情况下,如果短於长度限制会出现错误讯息,不过如果将 showError 设为 false 时,则不会出现错误讯息。

要测试这个元件是否正常,我们应该验证三种情况是否正确运行:

  • Case 1: 密码在大於或等於最短长度限制时,不会出现错误讯息。
  • Case 2: 密码少於最短长度限制时,出现错误讯息。
  • Case 3: 密码少於最短长度限制时,出现错误讯息,接着将 showError 为 false ,则不显示错误讯息。

由於这三个 case 使用到的观念与语法有非常多都是前面的文章介绍过的,所以今天我就不一个 case 一个 case 分开讲解,直接附上完整的程序码,也顺带介绍一个实用的语法 beforeEach()

如果没有看过前面几篇的朋友,建议可以先去看 Conditional rendering & Elements visibilityForm Elements Handling,会帮助你更了解以下的程序码。

describe('Props & Computed', () => {
  let wrapper
  const minLength = 6
  beforeEach(() => {
    wrapper = mount(Component, {
      props: {
        minLength
      }
    })
  })
  
  // Case 1: 密码在大於或等於最短长度限制时,不会出现错误讯息。
  test(`not renders an error if length is more than or equal to ${minLength}`, async () => {
    await wrapper.get('[data-test="password"]').setValue('123456')

    expect(wrapper.find('[data-test="errorMsg"]').exists()).toBe(false)
  })

  // Case 2: 密码少於最短长度限制时,出现错误讯息。
  test(`renders an error if length is less than ${minLength}`, async () => {
    await wrapper.get('[data-test="password"]').setValue('12345')

    expect(wrapper.html()).toContain(`Password must be at least ${minLength} characters`)
  })

  // Case 3: 当 showError 为 false 时,不显示错误讯息。
  test('not renders an error if showError is false ', async () => {
    await wrapper.get('[data-test="password"]').setValue('12345')

    expect(wrapper.html()).toContain(`Password must be at least ${minLength} characters`)

    await wrapper.setProps({ showError: false })

    expect(wrapper.find('[data-test="errorMsg"]').exists()).toBe(false)
  })
})

语法说明:

  • beforeEach() : 在每一个 test() 执行前运行的一个函式,常会用来初始化 wrapper 。
  • setProps(): 在 wrapper 生成後,动态的改变 props 的值。

参考资料


今天的分享就到这边,如果大家对我分享的内容有兴趣欢迎点击追踪 & 订阅系列文章,如果对内容有任何疑问,或是文章内容有错误,都非常欢迎留言讨论或指教的!

明天要来分享的是 Vue3 单元测试 (Unit Testing) 主题的第七篇 Testing Vuex ,那我们明天见!


<<:  CTF 初体验

>>:  [Day22]程序菜鸟自学C++资料结构演算法 – 气泡排序法(Bubble Sort)

Day9|工作区、暂存区、储存库,以及各执行的档案状态

前几篇章节经常提到使用 git add 加至暂存区,git commit 提交到储存库。这些工作区、...

Day.19 认识索引 - 二级索引 (Secondary Index)

InnoDB将索引分成Cluster Index & Secondary Index,认识...

Day6 - Hello World!!!

一切准备就绪 前置任务已经破玩了 今天要开始写我的第一个APP 大多数程序语言第一个写的程序几乎都是...

[Day7] Virtual Networks

今天来介绍虚拟网路的部分,既然我们都有各种的虚拟机器、虚拟服务,那想当然,这些服务就是透过虚拟网路进...

Day 15 知识地图

画出一张属於自己的学习地图,只有知道自己身在何处,才不会迷路。你必须知道这项学习的终点,该拥有什麽样...