Vue项目单元测试入门

本文以Jest测试框架为例子,介绍常用的api和用法

安装

第一种:创建项目的时候勾选 Unit Testing,后续选择 Jest
第二种:在项目根目录执行 vue add @vue/cli-plugin-unit-jest

常用api

describe:创建测试分组
test(别名:it):创建测试用例
expect:提供各种方法判定测试结果是否符合预期

匹配函数

toBe: 值类型判断相等
toEqual: 引用类型判断相等
toBeNull
toBeUndefined
toBedefined
toBeNaN
toBeTruthy
toBeFalsy
toContain: 数组是否包含
toHaveLenth: 数组长度
toThrow: 异常匹配

生命周期

beforeAll:所有测试用例执行前触发(只触发一次)
beforeEach:每个测试用例执行前触发
afterAll:所有测试用例执行后触发(只触发一次)
afterEach:每个测试用例执行后触发

组件

mount:挂载组件,包括子组件
shallowMount:只挂载当前组件,不包括子组件

Wrapper:挂载后返回vnode和测试相关的方法
vm:返回vue实例
classes:返回相关类名的dom或者集合
find:返回满足一个条件的dom
findAll:返回满足所有条件的dom
html:返回html字符串
text:返回内容字符串
setData:设置组件data
setProps:设置组件props
trigger:触发事件

用法

// utils.js
export function add(a, b) {
    return a + b
}

export class Count {
    constructor() {
        this.number = 1
    }

    increase() {
        this.number++
    }

    decreate() {
        this.number--
    }
}

export function timeout(fn) {
    setTimeout(function() {
        fn()
    }, 2000)
}

export function promise() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(2)
        }, 2000)
    })
}

常规测试

const { add } = require('./utils')

test('add 1 + 2 to equal 3', () => {
    expect(add(1, 2)).toBe(3)
})

分组测试

const { Count } = require('./utils')

describe('分组测试', () => {
    let obj = null
    beforeAll(() => {
        console.log('所有test执行前触发')
    })

    beforeEach(() => {
        // 利用生命周期,避免类对象状态相互影响
        console.log('每个test执行前触发')
        obj = new Count()
    })

    afterAll(() => {
        console.log('所有test执行完触发')
    })

    afterEach(() => {
        console.log('每个test执行完触发')
    })

    test('测试increase', () => {
        expect(obj.increase()).toBe(2)
    })

    test('测试decrease', () => {
        expect(obj.decrease()).toBe(0)
    })
})

异步代码测试

调用done函数

const { timeout } = require('./utils')

test('异步代码测试', done => {
    timeout(() => {
        expect(2 + 2).toBe(4)
        done()
    })
})

跳过等待的时间

const { timeout } = require('./utils')

test('异步代码测试', done => {
    jest.useFakeTimers()
    const fn = jest.fn()
    timeout(fn)
    jest.advanceTimersByTime(2000)
    expect(fn).toHaveBeenCalledTimes(1)
})

promise函数处理

方法一

const { promise } = require('./utils')

test('promise', () => {
    return promise().then(res => {
        expect(res).toBe(2)
    }) 
})

方法二

const { promise } = require('./utils')

test('promise', () => {
    return expect(promise()).resolves.toBe(2)
})

组件测试

// @/components/Modal.vue
<template>
  <div v-show="visible" class="modal-box">
    <div class="modal-title">{{ title }}</div>
    <div class="modal-content"></div>
  </div>
</template>

<script>
expect default {
  name: 'Modal',
  props: {
    visible: {
      type: Boolean,
      default: false
    },
    title: {
      type: String,
      default: ''
    }
  }
}
</script>
// @/tests/unit/Modal.spec.js
import { shallowMount } from '@vue/test-utils'
import Modal from '@/components/Modal'

it('test Modal props.title', () => {
  const title = '标题'
  const wrapper = shallowMount(Modal, {
    propsData: { title }
  })
 
  expect(wrapper.find('.modal-title').text()).toBe(title)
})
3 声望
0 粉丝
0 条评论
推荐阅读
vue3+typescript开发公共组件
记录一下vue3+typescript开发公共组件的注意事项项目结构 {代码...} 组件编写组件定义 {代码...} 组件声明,暴露 {代码...} 组件注册 {代码...} 编译插件 {代码...} 配置文件package.json {代码...} tsconfig.jso...

寻雾启示阅读 860

「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...

wuwhs39阅读 4.7k评论 5

封面图
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...

chokcoco19阅读 2k评论 2

在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...

边城17阅读 1.9k

封面图
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!

SegmentFault思否20阅读 5.6k评论 10

封面图
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...

原谅我一生不羁放歌搞文艺14阅读 19.8k评论 9

你可能不需要JS!CSS实现一个计时器
CSS现在可不仅仅只是改一个颜色这么简单,还可以做很多交互,比如做一个功能齐全的计时器?样式上并不复杂,主要是几个交互的地方数字时钟的变化开始、暂停操作重置操作如何仅使用 CSS 来实现这样的功能呢?一起...

XboxYan20阅读 1.5k评论 1

封面图
3 声望
0 粉丝
宣传栏