# 单元测试
# 什么是单元测试?
Unit Testing,又称为模块测试,是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
# 为什么需要单元测试?
- 可能会测出功能的隐藏bug。
- 保证代码重构的安全性。
- 组件库中每⼀个组件都可能会重构或者更新迭代,如果单元测试覆盖率⾼的话,修改代码之后就越可能会发现潜在的问题。⽐如版本升级后,导致某部分功能的缺失。
- 自动检测,可以做到一次编写,多次运行,节省重复测试的时间
# 技术选型
单元测试用到的工具大致分为三部分:分别为管理工具、测试框架、断言库。
本文选用Karma、Mocha和Chai。
Karma
是一个基于 Node.js 的 JavaScript 测试执行过程管理工具,又称Test Runner
。常用的管理工具还有Jest
等。Mocha
是一个功能丰富的前端测试框架。所谓"测试框架",就是运行测试的工具。通过它,可以为 JavaScript 应用添加测试用例,从而保证代码的质量。Mocha
既可以基于 Node.js 环境运行也可以在浏览器环境运行。常用的测试框架还有Asmine
、Jasmine
等。Chai
是一个断言库,类似于 Node 的内置断言。通过提供许多可以针对代码运行的断言,它使测试变得更加容易。
# Karma
作用:提供测试环境(呼起浏览器,加载测试脚本,然后运行测试用例)
配置:具体配置写在 karma.conf.js 中
# Mocha/chai/Sinon
作用:提供测试语法
Mocha:describe,it 语法
chai:expect 语法
Sinon/Sinon-Chai:为组件的事件测试设置回调函数
# 目录结构
|-- tests
|-- unit
|-- specs
|-- xxx.spec.js
|-- karma.conf.js
|-- index.js
# 测试对象
- 测DOM元素是否存在
- 测props是否接受
- 测事件
- CSS不测
# 关于异步
由于DOM元素的渲染是异步的,所以我们往往需要在设置 PropsData 后异步地测试DOM元素情况
it('toast 接受 autoClose 属性', (done) => {
const wrapper = mount(Toast, {
propsData: {
autoClose: 1
},
})
// 确保在vm.execAutoClose执行后再去判断vm.$el是否被移出document.body
setTimeout(() => {
// 判断vm.$el是否被移出document.body
expect(document.body.contains(wrapper.element)).to.equal(false)
done()
}, wrapper.props('autoClose') * 1000)
})