Vue进阶(四十五)Jest集成指南

文章目录

    • 一、前言
    • 二、环境检测
    • 三、集成问题汇总
    • 四、拓展阅读

一、前言

在前期博文《Vue进阶(八十八)Jest》中,讲解了Jest基本用法及应用示例。一切顺利的话,按照文档集成应用即可,但是集成过程中遇到的问题可能五花八门,此篇博文主要分享Vue集成Jest阶段遇到的问题及解决方案。

首先,需要确认项目自身环境参数配置,主要涉及babeljestbabel-jest,应用其中某个不合适的版本可能会导致各种嵌套问题出现,最终无法集成Jest。

二、环境检测

首先,检查项目应用的babel-corebabel-loader版本号,如果babel-core的版本号高于7且babel-loader的版本号高于8,则可按照以下步骤安装jest相关依赖。

如果babel-core版本为6,则需要安装babel-loader的版本也是6,不能高于8,另外安装下面依赖时需注意:

  • jest版本为21、22,推荐:^22.4.0
  • babel-jest为21、22,推荐:^22.4.0

检测项目nodenpm版本。版本低可能导致安装jest,vue/test-utils等依赖安装失败。

推荐使用npm版本>=6.9.0npm -v),推荐node版本>=10.15.0node -v

安装jest,通用js可以使用jest写单元测试。
安装命令:npm i -D jest@^22.4.0 或者 npm install --save-dev jest@^22.4.0

安装babel-jestBabel-jest对Es6+js进行转译。
安装命令:npm i -D babel-jest@^22.4.0 或者 npm install --save-dev babel-jest@^22.4.0

安装vue/test-utils。可以用来编写vue文件的单元测试
安装命令:npm i -D @vue/test-utils@^1.3.6或者 npm install --save-dev @vue/test-utils@^1.3.6

安装vue-jest,配合vue/test-utils使用。
安装命令:npm i -D vue-jest@3.0.6 或者 npm install --save-dev vue-jest@3.0.6

安装jsdom-global,为vue/test-utils运行器提供浏览器环境。
安装命令:npm i -D jsdom-global@^3.0.2 或者 npm install --save-dev jsdom-global@^3.0.2 `

安装jest-serializer-vue,序列化测试结果。
安装命令:npm i -D jest-serializer-vue@^3.1.0 或者 npm install --save-dev jest-serializer-vue@^3.1.0

依赖安装完成后,要关注关注项目能否正常启动。

三、集成问题汇总

1、npm install --save-dev jest@^27.5.1 执行这个命令时会把node_modules里面的jquery删掉,所以执行完后要启动项目看下是否缺少了jquery依赖,如果缺少,需要再次安装jquery

npm install --save-dev jquery@^3.3.1

2、启动npm run dev时报错信息:Module build failed: Error: Plugin/Preset files are not allowed to export objects, only functions.

报错原因babel-corebabel-loader版本冲突。
解决方案:首先检查项目的babel-corebabel-loader版本号,如果babel-core版本号高于7且babel-loader的版本号高于8,则可按照以下步骤安装jest相关依赖。

如果babel-core版本为6,则需要安装babel-loader的版本也是6,不能高于8,另外安装下面依赖时需注意:

  • jest版本为21、22,推荐:^22.4.0
  • babel-jest为21、22,推荐:^22.4.0

3、启动run test:unit时报错信息:Error: Cannot find module 'jest-transform-stub

报错原因:缺少相应依赖模块。
解决方案:安装相应模块。

4、报错信息:
在这里插入图片描述

报错原因:js文件没有转换
解决方案:修改jest.config.js,在文件中transform中加上!["^.+\\.(js)$": "babel-jest", // 用babel-jest 处理.js](https://img-blog.csdnimg.cn/direct/51f2f1d24d5d4fe7bc9511b6e7b84ebd.png)

5、报错信息:

报错原因babel-corebabel-loaderjestbabel-jest版本冲突。
解决方案:参考问题2,如果babel-core、babel-loader版本大于7则需要安装27以上的jestbabel-jest

6、报错信息: Test suite failed to run TypeError: $export is not a function

报错原因:在报错文件中用到了ES6的语法
解决方案:修改jest.config.js,在文件中transformIgnorePatterns中添加报错文件,忽略转换测试文件,例如:

transformIgnorePatterns: ["node_modules/(?!(.+)/)","node_modules/(?!(core-js)/)"],

或者可以忽略node_modules下面所有文件:transformIgnorePatterns: ["node_modules/"]

7、配置过程可能缺少的模块:babel-plugin-require-context-hook

8、报错信息: SecurityError: localStorage is not available for opaque origins
报错原因jest-unit运行环境未设置。
解决方案:修改jest.config.jsmodule.export中添加

testEnvironment: 'jsdom',
testURL:'http://localhost',

在这里插入图片描述

9、报错信息:

TypeError: Cannot set property $router of #<Vue$3> which has only a getter

      14 |     ]
      15 | })
    > 16 | localVue.prototype.$router =router
      17 | localVue.use(router)
      18 | const wrapper = mount(App,{localVue,router, store,
      19 |     mocks:{
      
      at Object.<anonymous> (tests/unit/src/App.spec.js:16:28)

报错原因:在测试文件中声明变量用了同一个变量名。

在这里插入图片描述

解决方案:修改变量名称:

在这里插入图片描述

10、报错信息:

Failed to collect coverage from ...
ERROR: Cannot read property 'fileCoverage' of undefined
STACK: TypeError: Cannot read property 'fileCoverage' of undefined

报错原因:项目中存在其他单元测试配置,使用了babelistanbul代码覆盖率插件,在.babelrc文件中多了istanbul,导致冲突
解决方案:修改.babelrc文件,去掉istanbul

11、报错信息:

Failed to collect coverage from ...t/funcinit.js: Unexpected token, expected ; (7:25)

报错原因:报错文件中存在语法错误,或者不规范使用,需要自己排查
解决方案:需自己排查。

12、报错信息:

FAIL  tests\unit\src\views\newModel\homePage\todolist\todolist\index.spec.js
  ● Test suite failed to run

    TypeError: _vm.$t is not a function

      1037 |                           aplno: row.aplno || '', // 序号
      1038 |                           recorddate: row.crtdt || '',
    > 1039 |                           customercode: row.customercode
      1040 |                         }
      1041 |                       }
      1042 |                       this.$router.push({
      
      at Proxy.render (src/views/newModel/homePage/todolist/todolist.vue:1039:1887)
      at Object.<anonymous> (tests/unit/src/views/newModel/homePage/todolist/todolist/index.spec.js:16:36)

报错原因:测试文件对应的文件中存在i18n,用于中英文翻译。
解决方案
方案1:在测试文件(断言文件)中添加$t定义。

在这里插入图片描述

方案2:在测试文件(断言文件)中引入i18n,定义i18n

在这里插入图片描述

13、报错信息:require.context is not a function

报错原因:语法不支持ES6
解决方案npm install babel-plugin-require-context-hook@^1.0.0
.babelrc文件plugins节点中添加

plugins: ["npm install babel-plugin-require-context-hook"]

14、报错信息:Unknown custom element:<el-table> - did you........
报错原因elementui组件未注册。
解决方案
方案一:在main.js全局注册

方案二:在jest.setup.js里面全局注册

15、报错信息:document is not function
报错原因:未设置测试环境
解决方案:修改jest.config.jsmodule.export中添加

testEnvironment: 'jsdom',
testURL:'http://localhost',  

在这里插入图片描述

添加完成后如果报缺少模块,可依照提示安装对应模块

16、报警告信息:
在这里插入图片描述

报错原因handlebar版本问题
解决方案npm install handlebar@^4.5.3

17、

Note: If you’ve turned off transpilation of ES6 modules with the option { “modules”: false }, you have to make sure to turn this on in
your test environment.

{
  "presets": [["env", {"modules": false}], "react"],
  "env": {
    "test": {
      "presets": [["env"], "react"]
    }
  }
}

总结:配置过程中可能因为版本的原因某些模块不需要安装,这些可忽略。各个模块最后实现的package.json可能不一致。

配置成功后,启动run test:unit后出现下面截图表示运行成功。项目中会多出来coverage文件夹,该文件夹不需要上传。

在这里插入图片描述

PS:Jest集成成功之后,需要启动项目看是否能启动成功,是否能组包成功!!!

四、拓展阅读

  • 《Vue进阶(八十八)Jest》
  • Jest 官网
  • babel

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/778474.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第55课-芝麻开门(语音 识别 控制3D纪念馆开门 和 关门)

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第55课-芝麻开门&#xff08;语音识别控制3D纪念馆开门和关门&#xff09; 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtn…

KVM使用命令行添加新磁盘(注:支持热插拔)

1、使用qemu-img创建格式为qcow2的磁盘 [rootkvm ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/test-disk.qcow2 15G 2、显示虚拟机硬盘列表&#xff0c;查看未使用的target [rootkvm ~]# virsh domblklist kvm-client 3、添加硬盘到kvm-client虚拟机中 [rootkvm…

SpringBoot | 大新闻项目后端(redis优化登录)

该项目的前篇内容的使用jwt令牌实现登录认证&#xff0c;使用Md5加密实现注册&#xff0c;在上一篇&#xff1a;http://t.csdnimg.cn/vn3rB 该篇主要内容&#xff1a;redis优化登录和ThreadLocal提供线程局部变量&#xff0c;以及该大新闻项目的主要代码。 redis优化登录 其实…

html+css+js图片手动轮播

源代码在界面图片后面 轮播演示用的几张图片是Bing上的&#xff0c;直接用的几张图片的URL&#xff0c;谁加载可能需要等一下&#xff0c;现实中替换成自己的图片即可 关注一下点个赞吧&#x1f604; 谢谢大佬 界面图片 源代码 <!DOCTYPE html> <html lang&quo…

C++继承初识

一。继承 1.继承本质是复用相同的代码&#xff08;属性&#xff09; 2.格式&#xff1a;class 类名&#xff1a;继承方式 父类 3.继承方式的规律&#xff1a; 父类的&#xff1a; 对于私有成员&#xff0c;不管哪种继承方式都不可见--->不想被子类继承的成员 对于保护…

代码随想录——划分字母区间(Leetcode763)

题目链接 贪心 class Solution {public List<Integer> partitionLabels(String s) {int[] count new int[27];Arrays.fill(count,0);// 统计元素最后一次出现的位置for(int i 0; i < s.length(); i){count[s.charAt(i) - a] i;}List<Integer> res new Ar…

非对称加密算法原理与应用2——RSA私钥加密文件

作者:私语茶馆 1.相关章节 (1)非对称加密算法原理与应用1——秘钥的生成-CSDN博客 第一章节讲述的是创建秘钥对,并将公钥和私钥导出为文件格式存储。 本章节继续讲如何利用私钥加密内容,包括从密钥库或文件中读取私钥,并用RSA算法加密文件和String。 2.私钥加密的概述…

JDK都出到20多了,你还不会使用JDK8的Stream流写代码吗?

目录 前言 Stream流 是什么&#xff1f; 为什么要用Steam流 常见stream流使用案例 映射 map() & 集合 collect() 单字段映射 多字段映射 映射为其他的对象 映射为 Map 去重 distinct() 过滤 filter() Stream流的其他方法 使用Stream流的弊端 前言 当你某天看…

深度学习模型加密python版本

支持加密的模型: # torch、torch script、onnx、tensorrt 、torch2trt、tensorflow、tensorflow2tensorrt、paddlepaddle、paddle2tensorrt 深度学习推理模型通常以文件的形式进行保存&#xff0c;相应的推理引擎通过读取模型文件并反序列化即可进行推理过程. 这样一来&#…

跨平台Ribbon UI组件QtitanRibbon全新发布v6.7.0——支持Qt 6.6.3

没有Microsoft在其办公解决方案中提供的界面&#xff0c;就无法想象现代应用程序&#xff0c;这个概念称为Ribbon UI&#xff0c;目前它是使应用程序与时俱进的主要属性。QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件&#xff0c;QtitanRibb…

vue3【实战】来回拖拽放置图片

效果预览 技术要点 img 标签默认就是可拖拽的&#xff08;a 标签也是&#xff09;事件 e 内的 dataTransfer 对象可用于临时存储事件过程中的数据拖拽事件的默认行为是用浏览器新开页签打开被拖拽对象&#xff0c;所以通常需要禁用默认的浏览器行为被拖拽元素必须设置 id&#…

拉曼光谱入门:2.拉曼光谱发展史、拉曼效应与试样温度的确定方法

1.拉曼光谱技术发展史 这里用简单的箭头与关键字来概括一下拉曼光谱技术的发展史 1928年&#xff1a;拉曼效应的发现 → 拉曼光谱术的初步应用20世纪40年代&#xff1a;红外光谱术的发展 → 拉曼光谱术的限制20世纪60年代&#xff1a;激光作为光源的引入 → 拉曼光谱术的性能提…

阿里云人工智能平台PAI部署开源大模型chatglm3之失败记录

想学习怎么部署大模型&#xff0c;跟着网上的帖子部署了一个星期&#xff0c;然而没有成功。失败的经历也是经历&#xff0c;记在这里。 我一共创建了3个实例来部署chatglm3&#xff0c;每个实例都是基于V100创建的&#xff08;当时没有A10可选了&#xff09;&#xff0c;其显…

数据库缓存管理

1. 简介 缓存管理器是数据库管理系统&#xff08;DBMS&#xff09;中负责管理内存中page并处理文件和索引管理器的page请求的组件。由于内存空间有限&#xff0c;我们不能将所有page存储在缓存池中。因此&#xff0c;缓存管理器需要制定替换策略&#xff0c;当空间填满时选择哪…

rider使用libman

问题 rider没有libman的相关功能&#xff0c;需要使用cli 安装Libman dotnet tool install -g Microsoft.Web.LibraryManager.Cli # 如果存在可以尝试更新 dotnet tool update -g Microsoft.Web.LibraryManager.Cli查看命令 libman --help初始化 cdnjs官网 libman init安…

【十三】图解 Spring 核心数据结构:BeanDefinition 其二

图解 Spring 核心数据结构&#xff1a;BeanDefinition 其二 概述 前面写过一篇相关文章作为开篇介绍了一下BeanDefinition&#xff0c;本篇将深入细节来向读者展示BeanDefinition的设计&#xff0c;让我们一起来揭开日常开发中使用的bean的神秘面纱&#xff0c;深入细节透彻理解…

CTFShow的RE题(三)

数学不及格 strtol 函数 long strtol(char str, char **endptr, int base); 将字符串转换为长整型 就是解这个方程组了 主要就是 v4, v9的关系&#xff0c; 3v9-(v10v11v12)62d10d4673 v4 v12 v11 v10 0x13A31412F8C 得到 3*v9v419D024E75FF(1773860189695) 重点&…

刷代码随想录有感(127):动态规划——判断是否为子序列

题干&#xff1a; 代码&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {vector<vector<int>>dp(s.size() 1, vector<int>(t.size() 1, 0));for(int i 1; i < s.size(); i){for(int j 1; j < t.size(); j){if(s[i …

方法引用详解

什么是方法引用&#xff1f;&#xff1a;针对于函数式接口中的抽象方法 为什么用方法引用&#xff1f;&#xff1a;避免代码的重复&#xff0c;简便书写&#xff0c;提高效率 在使用Lambda表达式的时候&#xff0c;我们实际上传递进去的代码就是一种解决方案&#xff1a;拿参数…

数据结构之“栈”(全方位认识)

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 前言 栈是一种数据结构&#xff0c;具有" 后进先出 "的特点 或者也可见说是 ” 先进后出 “。大家一起加油吧冲冲冲&#xff01;&#xff01; …