学习对vue组件进行单元测试,先参照官网编写组件和测试脚本。

1、简单的组件

组件无依赖,无props

对于无需导入任何依赖,也没有props的,直接编写测试案例即可。

/src/testSrc/simpleComp.vue

  1. <template>
  2. <span>{{ message }}</span>
  3. </template>
  4.  
  5. <script>
  6. export default {
  7. data () {
  8. return {
  9. message: 'hello!'
  10. }
  11. },
  12. created () {
  13. this.message = 'bye!'
  14. }
  15. }
  16. </script>

/test/unit/specs/simpleComp.secs.js

  1. import Vue from 'vue'
  2. import simpleComp from '@/testSrc/simpleComp.vue'
  3.  
  4. describe('simpleComp', () => {
  5. // 检查原始组件选项
  6. it('has a created hook', () => {
  7. expect(typeof simpleComp.created).to.eql('function')
  8. })
  9.  
  10. // 评估原始组件选项中的函数结果
  11. it('sets the correct default data', () => {
  12. expect(typeof simpleComp.data).to.eql('function')
  13. const defaultData = simpleComp.data()
  14. expect(defaultData.message).to.eql('hello!')
  15. })
  16.  
  17. // 检查 mount 中的组建实例
  18. it('correctly sets the message when created', () => {
  19. const vm = new Vue(simpleComp).$mount()
  20. expect(vm.message).to.eql('bye!')
  21. })
  22.  
  23. // 创建一个实例并检查渲染输出
  24. it('renders the correct message', () => {
  25. const Constructor = Vue.extend(simpleComp)
  26. const vm = new Constructor().$mount()
  27. expect(vm.$el.textContent).to.eql('bye!')
  28. })
  29. })

 describe('', () => {// describe块

  it('', () => {  //一个it块代表一个测试用例

  })

// 多个it块构成了test suite【测试套件】

})

 我在测试的时候是一个it块一个it块的增加,每编写完成一个it块,就保存并查看【#karma start】监控的运行结果。大概就是webpack compile 成功与否,测试用例在各浏览器的运行情况,代码覆盖率总结报告。

这里应该是 8 SUCCESS, 忘记截图了。Statements表示“声明”,Branches表示分支,Functions表示方法,Lines表示行的覆盖率。 

 

2、有入参的组件

组件有props

对于组件需要props,编写单元测试时,通过propsData传递该参数。

/src/testSrc/propComp.vue

  1. <template>
  2. <p>{{ msg }}</p>
  3. </template>
  4.  
  5. <script>
  6. export default {
  7. props: ['msg']
  8. }
  9. </script>

  

/test/unit/specs/propComp.specs.js

  1. /**
  2. * 组件需要 props 时,通过 propsData 传递该参数
  3. */
  4. import Vue from 'vue'
  5. import propComp from '@/testSrc/propComp.vue'
  6.  
  7. function getRenderedText (Component, propsDataMsg) {
  8. const Ctor = Vue.extend(Component)
  9. const vm = new Ctor({ propsData: propsDataMsg }).$mount()
  10. return vm.$el.textContent
  11. }
  12.  
  13. describe('propComp', () => {
  14. it('renders correctly with different props', () => {
  15. expect(getRenderedText(propComp, {
  16. msg: 'Hello'
  17. })).to.eql('Hello')
  18.  
  19. expect(getRenderedText(propComp, {
  20. msg: 'Bye'
  21. })).to.eql('Bye')
  22. })
  23. })

3、有依赖其他组件的组件【TODO-->未解决,会报错还没理解】

若组件存在依赖,则可通过inject-loader解决。inject-loader可将任意依赖项注入到*.vue组件中。

/src/testSrc/dependencyComp.vue

  1. <template>
  2. <div class="msg">
  3. {{ msg }}
  4. </div>
  5. </template>
  6.  
  7. <script>
  8. // this dependency needs to be mocked
  9. import SomeService from '../service'
  10.  
  11. export default {
  12. data () {
  13. return {
  14. msg: SomeService.msg
  15. }
  16. }
  17. }
  18. </script>

/test/unit/specs/dependencyComp.specs.js

  1. import Vue from 'vue'
  2.  
  3. // "!!"表示禁用全局配置的所有loaders。“vue-loader?inject!”表示使用vue-loader,传入inject参数
  4. const ExampleInjector = require('!!vue-loader?inject!./example.vue')
  5. // 运行ExampleInjector函数返回一个denpendencyComp的实例,该实例中denpendencyComp组件的依赖项已被模拟
  6. const ExampleWithMocks = ExampleInjector({
  7. // mock it
  8. '../service': {
  9. msg: 'Hello from a mocked service!'
  10. }
  11. })
  12.  
  13. describe('dependencyComp', () => {
  14. it('should render', () => {
  15. const vm = new Vue({
  16. template: '<div><test></test></div>',
  17. components: {
  18. 'test': ExampleWithMocks
  19. }
  20. }).$mount()
  21.  
  22. expect(vm.$el.querySelector('.msg').textContent).to.eql('Hello from a mocked service!')
  23. })
  24. })

4、有异步操作的组件

对于异步操作,it块执行的时候,需要传入一个回调函数,通常该函数被命名为done。当测试结束的时候,必须显式调用这个函数【done()】,告诉Mocha测试结束了。否则,Mocha就无法知道,测试是否结束,会一直等到超时报错。

就用之前编写的简单的组件,增加测试用例 —— it块就行了。

/src/testSrc/simpleComp.vue

【见1、简单的组件

更新 /test/unit/specs/simpleComp.specs.js

  1. // 新增一个it块
  2. // 异步操作:在状态更新后检查生成的 HTML
  3. it('updates the rendered message when vm.message updates', done => {
  4. const vm = new Vue(simpleComp).$mount()
  5. vm.message = 'foo'
  6. // 在状态改变后和断言 DOM 更新前等待一刻
  7. Vue.nextTick(() => {
  8. expect(vm.$el.textContent).to.eql('foo')
  9. done() //显示调用结束函数done(),告诉mocha异步操作结束
  10. })
  11. })

#karma start

实际上总共只有7个测试用例(即7个it块),但是我配置浏览器的时候配置了两个(Chrome、FireFox),每个而是用例都会在它们两个浏览器运行,故而总共运行了14个。  

资料:

1、Vue单元测试---Karma+Mocha+Chai实践

#单元测试#以karma+mocha+chai 为测试框架的Vue webpack项目(二)的更多相关文章

  1. #单元测试#以karma+mocha+chai 为测试框架的Vue webpack项目(一)

    目标: 为已有的vue项目搭建 karma+mocha+chai 测试框架 编写组件测试脚本 测试运行通过 抽出共通 一.初始化项目 新建项目文件夹并克隆要测试的已有项目 webAdmin-web 转 ...

  2. 大前端的自动化工厂(5)—— 基于Karma+Mocha+Chai的单元测试和接口测试

    一. 前端自动化测试 大多数前端开发者对测试相关的知识是比较缺乏的,一来是开发节奏很快,来不及写,另一方面团队里也配备了"人肉测试机",完全没必要自己来.但随着项目体量的增大,许多 ...

  3. 搭建 vue2 单元测试环境(karma+mocha+webpack3)

    从网上找了很多例子关于单元测试,都是如何新建项目的时候的添加单元测试,用vue-cli中怎么添加,但是我的项目已经生成了,不能再一次重新初始化,这时如何添加单元测试,这里面遇到了好多坑,写在这里记录一 ...

  4. 使用 TypeScript & mocha & chai 写测试代码实战(17 个视频)

    使用 TypeScript & mocha & chai 写测试代码实战(17 个视频) 使用 TypeScript & mocha & chai 写测试代码实战 #1 ...

  5. 自动化单元测试(Karma + Mocha)

    使用 Karma + Mocha做单元测试 Karma([ˈkɑrmə] 卡玛)是一个测试运行器,它可以呼起浏览器,加载测试脚本,然后运行测试用例 Mocha([ˈmoʊkə] 摩卡)是一个单元测试框 ...

  6. 带你入门带你飞Ⅱ 使用Mocha + Chai + SuperTest测试Restful API in node.js

    目录 1. 简介 2. 准备开始 3. Restful API测试实战 Example 1 - GET Example 2 - Post Example 3 - Put Example 4 - Del ...

  7. 从零开始搭建Electron+Vue+Webpack项目框架,一套代码,同时构建客户端、web端(一)

    摘要:随着前端技术的飞速发展,越来越多的技术领域开始被前端工程师踏足.从NodeJs问世至今,各种前端工具脚手架.服务端框架层出不穷,“全栈工程师”对于前端开发者来说,再也不只是说说而已.在NodeJ ...

  8. 【原创】从零开始搭建Electron+Vue+Webpack项目框架,一套代码,同时构建客户端、web端(二)

    摘要:上篇文章说到了如何新建工程,并启动一个最简单的Electron应用.“跑起来”了Electron,那就接着把Vue“跑起来”吧.有一点需要说明的是,webpack是贯穿这个系列始终的,我也是本着 ...

  9. 【原创】从零开始搭建Electron+Vue+Webpack项目框架(五)预加载和Electron自动更新

    导航: (一)Electron跑起来(二)从零搭建Vue全家桶+webpack项目框架(三)Electron+Vue+Webpack,联合调试整个项目(四)Electron配置润色(五)预加载及自动更 ...

随机推荐

  1. 误删除google浏览器用户,如何恢复之前收藏的标签,亲测有效

    第一种方案: 看 路径 C:\Users\admin\AppData\Local\Google\Chrome\User Data\Default  下或者 C:\Users\admin\AppData ...

  2. Apache Shiro(四)-登录认证和权限管理WEB支持(Servlet)

    新建web项目 web.xml 修改web.xml,在里面加了个过滤器. 这个过滤器的作用,简单的说,就是 Shiro 入门里的TestShiro 这部分的工作,悄悄的干了. //加载配置文件,并获取 ...

  3. PIE SDK图像裁剪

    1.算法功能简介 图像裁剪的目的是获取选定的影像范围区域.图像裁切工具提供像素范围裁切.矢量裁切.栅格图像裁切和几何图元裁切四种方式. 像素范围裁切是基于像素坐标获取矩形裁切区域的裁切方式:矢量裁切是 ...

  4. ali代码风格

    如下: <?xml version="1.0" encoding="UTF-8" standalone="no"?><pr ...

  5. Ba Gua Zhen

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5544 学习链接:https://www.cnblogs.com/qscqesze/p/4902518. ...

  6. 在Spark shell中基于Alluxio进行wordcount交互式分析

    Spark是一个分布式内存计算框架,可部署在YARN或者MESOS管理的分布式系统中(Fully Distributed),也可以以Pseudo Distributed方式部署在单个机器上面,还可以以 ...

  7. 常用Redis命令

    在 Windows 下配置 Redis 集群 在 Windows 下配置多个 Redis(简化配置) MicrosoftArchive/redis 官方Redis集群搭建文档 Redis命令 Cent ...

  8. WPF中嵌入Skyline提供的COM组件填坑

    网上有很多关于在WPF中使用的Skyline提供的COM组件的教程,但大都雷同一律,其中很多的细节均为涉及,本文意在在其原基础上进行一些细节的补充. 工具:Visual Studio 2017 1.  ...

  9. springboot整合rabbitmq,支持消息确认机制

    安装 推荐一篇博客https://blog.csdn.net/zhuzhezhuzhe1/article/details/80464291 项目结构 POM.XML <?xml version= ...

  10. 如何用webgl(three.js)搭建一个3D库房,3D密集架,3D档案室,-第二课

    闲话少叙,我们接着第一课继续讲(http://www.cnblogs.com/yeyunfei/p/7899613.html),很久没有做技术分享了.很多人问第二课有没有,我也是抽空写一下第二课. 第 ...