Vue | 26 工具 - 单元测试

news/2024/7/10 2:02:38 标签: vue, frontend technology, framework

主要内容:

  1. 简单的断言
  2. 写可测试的组件
  3. 断言的异步更新

Vue CLI已经为单元测试构建了操作项,使用Jest或Mocha开箱即用。我们也提供了官方的单元测试库Vue Test Utils,为自定义配置提供了更为细节的指导。

简单的断言

你不必为了组件的可测试性提供任何特殊操作,导出原生的操作即可:

<template>
	<span>{{ message }}<span>
</template>

<script>
	export default {
		data () {
				return {
						message: 'hello!'
				}
		  },
		  created () {
				  this.message = 'bye!'
		  }
	}
<script>

然后随着Vue的导入组件的选项,你可以写一些常用的断言(这里我们使用Jasmine/Jest风格的expect作为例子):

// 导入Vue和被测试的组件
import Vue from 'vue'
import MyComponent from 'path/to/MyComponent.vue'

// 这是一些Jasmine 2.0 测试,不过你可以使用能使用任何测试运行器/断言库
describe('MyComponent', () => {
	// 检查原生组件项
	it('has a created hook', () => {
		expect(typeof MyComponent.created).toBe('function')
	})
	
	// 在原生组件项中计算函数的结果
	it('sets the correct default data', () => {
		expect(typeof MyComponent.data).toBe('function')
		const defaultData = MyComponent.data()
		expect(defaultData.message).toBe('hello!')
	})

	// 在mount中检查组件实例
	it('correctly  sets the message when created', () => {
		const vm = new Vue(MyComponent).$mount()
		expect(vm.message).toBe('bye!')
	})
	
	// 挂载一个实例并检查渲染输出
	it('renders the correct message', () => {
		const Constuctor = Vue.extend(MyComponent)
		const vm = new Constructor().$mount()
		expect(vm.$el.textContent).toBe('bye!')
	})
}

编写可被测试的组件

一个组件的渲染输出主要由它所接收的props决定,如果一个组件的渲染输出只依赖于它的props,那么测试将变得简单,就好像断言纯函数的不同参数的返回值。

<template>
	<p>{{ msg }}</p>
</template>
<script>
	export default {
		props: ['msg']	
	}
</script>

你能使用propsData操作项用不同的props去断言渲染的输出:

import Vue from 'vue'
import MyComponent from './MyComponent.vue'

// 帮助函数:加载和返回渲染文本
function getRederedText (Component, propsData) {
	const Constructor = Vue.extend(Component)
	const vm = new Constructor({ propsData: propsData }).$mount()
	return vm.$el.textContent
}

describe('MyComponent', () => {
	it('renders correctly with different props', () => {
		expect(getRenderedText(MyComponent, {
			msg: 'Hello'
		})).toBe('Hello')

		expect(getRenderedText(MyComponent, {
			msg: 'Bye'
		})).toBe('Bye')
	})
})

断言异步更新

由于Vue执行异步更新DOM performs DOM updates asynchronously,一些状态改变导致的DOM更新的断言必须在Vue.nextTick回调中进行:

// 状态更新之后,检查生成的HTML
it('updates the rendered message when vm.message updates', done => {
	const vm = new Vue(MyComponent).$mount()
	vm.message = 'foo'
	
	// 在断言DOM更新之前,状态改变之后等待一个“tick”
	Vue.nextTick(() => {
		expect(vm.$el.textContent).toBe('foo')
		done()
	})
})

对于更深入的Vue单元测试内容,移步Vue Text Utils和我们关于unit testing vue components cookbook的文章。


http://www.niftyadmin.cn/n/1035747.html

相关文章

SAP ABAP收货或者货物移动(MIGO,MB11,MB1A)在保存时候的增强点

增强的BADI是&#xff1a;MB_DOCUMENT_BADI&#xff0c;特别要注意的是假如你是想在 点击保存按钮的时候根据生成的凭证号&#xff08;即表示这个增强点处凭证号已经生成&#xff09;&#xff0c;把某些数据更新到你的自建表的话&#xff0c;要用第二个方法MB_DOCUMENT_UPDATE,…

Vue | 27 工具 - TypeScript 支持

主要内容&#xff1a; JavaScript在官方的声明及推荐配置创建工程及编码的开发工具推荐基本用例演示基于类风格的Vue组件插件使用中的参数类型注释返回类型 Vue CLI提供了构建 TypeScript工具支持。在Vue的下一个主要版本&#xff08;3.x&#xff09;我们也计划更多的提供我们对…

android Timer TimerTask源码

知识点整理Timer1.Timer的使用2 Timer源码解析在jdk自带的库中,有两种技术可以实现定时任务。一种是使用Timer,另外一个则是ScheduledThreadPoolExecutor这篇先讲解TimerTimer 1.Timer的使用 private Timer timer new Timer();timer.scheduleAtFixedRate(new TimerTask() {O…

Vue | 28 工具 - 产品部署

主要内容&#xff1a; 打开生产模式的几种配置方式预编译模板提取组件CSS的方式追踪运行时错误 如果你使用Vue CLI以下大部分建议是默认可用的。如果你使用的是自定义的构建设置时&#xff0c;这章才是相关的。 打开生产模式 在开发阶段&#xff0c;Vue对于常见的错误和陷阱提…

Vue | 29 规模化 - 路由

官方路由 对于大多数单页面应用&#xff0c;推荐使用官方支持的vue-router library&#xff0c;对于更多的细节&#xff0c;查看vue-router的文档。 从零开始简单的路由 如果你仅仅需要一个非常简单的路由&#xff0c;但不需要包含一个完整功能的路由库&#xff0c;你可以像…

C++指针讲解

知识点整理1.指针基本使用2.*p (*p) *p *p 区别3指针常量 常量指针 指向常量常量指针3 野指针使用注意4通用指针5 指针的算术运算&#xff08;指针步长&#xff09;6 指针与数组6.1指针与一维数组6.1.1 一维数组函数传参6.2 指针与二维数组6.2.1 二维数组函数传参7 数组指针与指…

Vue | 30 规模化 - 状态管理

类Flux官方实现 由于多个状态分散在不同的组件和组件直接的交互中&#xff0c;大型应用常常变得复杂。为了解决这个问题&#xff0c;Vue提供了vuex&#xff1a;我们有受到Elm启发的状态管理库。它甚至集成进了vue-devtools&#xff0c;无需配置即可进行时光旅行调试。 React …

Vue | 31 规模化 - 服务端渲染

完整的服务端渲染指南 我们为在服务端渲染Vue应用创建了一个完整的指导。对于那些已经熟悉Vue客户端开发、服务端Node.js开发和webpack的人来说&#xff0c;很适合阅读这份更深入的指南。请移步ssr.vuejs.org。 Nuxt.js 正确配置可用于生产环境的服务器渲染应用可能是相当复…