Vue-Jest 自动化测试基础配置详解

目录
  • 安装
  • 配置
    • 常见错误
  • 测试前的工作
    • 处理依赖
    • 生成实例和 DOM
  • 总结
  • 引用

目前开发大型应用,测试是一个非常重要的环节,而在 Vue 项目中做单元测试可以用 Jest,Jest 是 facebook 推出的一款测试框架,集成了 Mocha, chai, jsdom, sinon 等功能,而且在 Vue 的脚手架中已经集成了 Jest,所以在 Vue 项目中使用 Jest 做单元测试是不二的选择,从提供的例子上看都很简单地配置并测试成功,然而在实际项目中有很多差异,我在测试自己的某个业务组件就报出很多错误,本文就总结一下自己的踩坑经历,并帮助读者快速解决配置中出现的问题。

安装

可以通过官方提供的 @vue/cli 直接创建 Vue 项目,然后选中 Unit Testing 这个选项

? Check the features needed for your project:
 ◉ Choose Vue version
 ◉ Babel
❯◉ TypeScript
 ◯ Progressive Web App (PWA) Support
 ◉ Router
 ◉ Vuex
 ◯ CSS Pre-processors
 ◯ Linter / Formatter
 ◉ Unit Testing
 ◯ E2E Testing

然后在测试框架中选择 Jest

? Pick a unit testing solution: Jest
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated con
fig files

Vue + Ts 的项目最终生成的 jest.config.js 配置文件长这样,好像在告诉我们,我都给你们设置好了,直接用吧,然而针对项目,还需要手动去配置兼容,要不然会报出很多错误,无法进行下去。

module.exports = {
  preset: '@vue/cli-plugin-unit-jest/presets/typescript-and-babel'
}

配置

先看看这个预设配置到底写了什么,找到 @vue/cli-plugin-unit-jest/presets/typescript-and-babel 这个包,实际上这个输出的配置如下:

module.exports = {
  moduleFileExtensions: [ // 测试的文件类型
    'js',
    'jsx',
    'json',
    // tell Jest to handle *.vue files
    'vue',
    'ts',
    'tsx'
  ],
  transform: { // 转化方式
    // process *.vue files with vue-jest
    '^.+\\.vue$': require.resolve('vue-jest'),
    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
    require.resolve('jest-transform-stub'),
    '^.+\\.jsx?$': require.resolve('babel-jest'),
    '^.+\\.tsx?$': require.resolve('ts-jest'),
  },
  transformIgnorePatterns: ['/node_modules/'],  // 转化时忽略 node_modules
  // support the same @ -> src alias mapping in source code
  moduleNameMapper: { // @符号 表示当前项目下的src
    '^@/(.*)$': '<rootDir>/src/$1'
  },
  testEnvironment: 'jest-environment-jsdom-fifteen',
  // serializer for snapshots
  snapshotSerializers: [ // 快照的配置
    'jest-serializer-vue'
  ],
  testMatch: [ // 默认测试文件
    '**/tests/unit/**/*.spec.[jt]s?(x)',
    '**/__tests__/*.[jt]s?(x)'
  ],
  // https://github.com/facebook/jest/issues/6766
  testURL: 'http://localhost/',
  watchPlugins: [
    require.resolve('jest-watch-typeahead/filename'),
    require.resolve('jest-watch-typeahead/testname')
  ],
  globals: {
    'ts-jest': {
      babelConfig: true
    }
  }
}

其中比较重要的配置,也是我们比较多用来解决问题的配置:

  • moduleFileExtensions : 测试的文件类型,这里默认的配置基本涵盖了文件类型,所以这里一般不需要改
  • transform : 转化方式,匹配的文件要经过转译才能被识别,否则会报错。
  • transformIgnorePatterns : 转化忽略配置
  • moduleNameMapper : 模块别名,如果有用到都要填写进去

常见错误

SyntaxError : 语法错误,很可能是因为没有进行转化,比如下面的提示:

 /Users/zhuangbing.cai/Documents/workspace/projects/wms-ui/node_modules/vue-runtime-helpers/dist/normalize-component.mjs:76
    export default normalizeComponent;
    ^^^^^^

    SyntaxError: Unexpected token 'export'

由于我们没有对 .mjs 文件进行转换导致了报错,最快的解决方式就是在 transform 补充 .mjs 的转化

transform: {
     '^.+\\.mjs$': 'babel-jest'
}

只需要在对 .mjs 的文件,提供转化方式即可。

另一种语法错误,是node_module 内的某些文件需要转化,然而被 transformIgnorePatterns 配置忽略了。

    Here's what you can do:
     • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
     • If you need a custom transformation specify a "transform" option in your config.
     • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

    You'll find more details and examples of these config options in the docs:
    https://jestjs.io/docs/en/configuration.html

    Details:

    /Users/zhuangbing.cai/Documents/workspace/projects/wms-ui/node_modules/vue-runtime-helpers/dist/normalize-component.mjs:76
    export default normalizeComponent;
    ^^^^^^

    SyntaxError: Unexpected token 'export'

图中 vue-runtime-helpers 被用到了,然而因为 transformIgnorePatterns  的配置忽略了转化,从而导致语法错误。解决方法就是改变 transformIgnorePatterns  的配置,如下:

transformIgnorePatterns: [
    // 转化时忽略 node_modules,但不包括 vue-runtime-helpers
    '/node_modules/(?!(vue-runtime-helpers)/)',
  ],

将 vue-runtime-helpers 排除后,转化的时候就不会忽略它,从而解决语法报错的问题。

Ts 类型错误

 TypeScript diagnostics (customize using `[jest-config].globals.ts-jest.diagnostics` option):
    src/views/inventory-map/__tests__/available.spec.ts:15:1 - error TS2304: Cannot find name 'beforeEach'.

    15 beforeEach(() => {
       ~~~~~~~~~~
    src/views/inventory-map/__tests__/available.spec.ts:19:1 - error TS2593: Cannot find name 'describe'. Do you need to install type definitions for a test runner? Try `npm i @types/jest` or `npm i @types/mocha` and then add `jest` or `mocha` to the types field in your tsconfig.

    19 describe('available-inventory-map', () => {
       ~~~~~~~~
    src/views/inventory-map/__tests__/available.spec.ts:20:3 - error TS2593: Cannot find name 'it'. Do you need to install type definitions for a test runner? Try `npm i @types/jest` or `npm i @types/mocha` and then add `jest` or `mocha` to the types field in your tsconfig.

根据提示需要在 tscofig.json 中添加

{
    "compilerOptions": {
    "types": [
      "webpack-env",
      "jest"
    ],
  }
}

测试前的工作

在编写测试用例前,我们需要 Jest 提供组件实例 vm 和渲染的 DOM 结构。对代码逻辑、页面效果的双重测试保障,那么如何获取到这个业务组件?

直接引用组件是不行的,因为你的业务组件需要的依赖很多,比如 UI 组件库、工具函数、Vuex 的状态等,所以首先我们需要处理好这些依赖。

处理依赖

首先要知道要测试的这个业务组件依赖了哪些东西,全局的依赖可以参照 main.ts 或 main.js 入口文件处,其他可根据组件中的引用来判断。有了依赖后如何在 Jest 中获得组件实例?

Vue 提供了一个单元测试实用工具库 - Vue Test Utils,编写测试用例的时候可以用到它,首先利用 createLocalVue 创建一个 Vue 的类供你添加组件、混入和安装插件而不会污染全局的 Vue 类, 接着将依赖引用进去。

const _localVue = createLocalVue();
_localVue.use(Vuex);
_localVue.use(UI);
_localVue.use(i18nInstall);
_localVue.component('s-filter', SFilter);
_localVue.component('w-table', WTable);
_localVue.directive('xxx', {
  inserted: (el, binding) => {
    ....
  },
});
export const localVue = _localVue;

这样就拿到了一个包含依赖的 Vue 类,接着处理 Vuex,比如我们需要枚举值

import enums from './enums';
export const systemStore = new Vuex.Store({
  actions: {},
  state: {
    enums: {
      systemEnums: enums,
    },
  },
});

生成实例和 DOM

在得到 localVue 和 store 之后,我们要用它去生成结果,通过 mount 将组件渲染出来。

import { localVue, systemStore } from '@/utils/unit-test/common';
import { mount } from '@vue/test-utils';
require('intersection-observer'); // 兼容jsdom不支持IntersectionObserver
import TaskList from '../available-inventory-map/index.vue'; // 引用要测试的业务
let store: any;
beforeEach(() => {
  store = systemStore;
});

describe('available-inventory-map', () => {
  it('筛选项测试', () => {
    const renderer = createRenderer();
    const wrapper = mount(TaskList, {
      localVue,
      store,
      attachToDocument: true,
    });
    const html = wrapper.html(); // 得到完整的 html 结构
    const vm = wrapper.vm; // 组件实例
    console.log(html, vm);
  })
}

将 localVue 和 store,通过 mount 最终得到实例和它的 DOM 结构。接下来就可以根据实例和 DOM 去编写自己的测试用例啦。

总结

本文主要介绍了在 Vue + Ts 项目中配置 Jest 自动化测试中遇到的问题总结,介绍基本配置和常见错误的解决方法,以及如何在开始编写测试用例前得到完整的组件信息和 DOM。为接下来的用例编写打下基础。

引用

Vue Test Utils

到此这篇关于Vue-Jest 自动化测试基础配置详解的文章就介绍到这了,更多相关Vue-Jest 自动化测试内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue如何自动化打包测试环境和正式环境的dist/test文件

    使用vue现在已经差不多2年了,想起来两年前的一次和某阿里处理的技术大牛(当时我们的技术总监)一起开发一个SPA项目的时候被硬着头皮去解决的一个难题,因为技术老大是阿里出身的,所以很多东西都是比较倾向于自动化,从项目ui设计到项目管理,到打包测试,到发布全部都要求我们要实现自动化,尽可能的减少手动操作. 当时技术大佬要求的事在jenkins进行一键打包,就是他点击不同的按钮在同一套代码上面分别打包测试环境运行的包和正式环境运行的包,刚刚接触vue的我摸不着头脑,老大给了我一天时间研究这个玩意,没

  • Vue-Jest 自动化测试基础配置详解

    目录 安装 配置 常见错误 测试前的工作 处理依赖 生成实例和 DOM 总结 引用 目前开发大型应用,测试是一个非常重要的环节,而在 Vue 项目中做单元测试可以用 Jest,Jest 是 facebook 推出的一款测试框架,集成了 Mocha, chai, jsdom, sinon 等功能,而且在 Vue 的脚手架中已经集成了 Jest,所以在 Vue 项目中使用 Jest 做单元测试是不二的选择,从提供的例子上看都很简单地配置并测试成功,然而在实际项目中有很多差异,我在测试自己的某个业务组

  • Vue的Props实例配置详解

    目录 1.Prop 的大小写 2.Prop 类型 3.Prop验证 4.传递静态|动态 Prop 5.修改Prop数据 适用于:父子组件通信. 如果父组件给子组件传递(函数)数据:本质是子组件给父组件传递数据: 如果父组件给子组件传递的(非函数)数据:本质就是父组件给子组件传递数据. 路由组件也可以传递 props数据. 1.Prop 的大小写 HTML 中的 属性名大小写不敏感,浏览器会把所有大写字符解释为小写字符.这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的

  • vue快捷键与基础指令详解

    v-bind可以简写成   : <img src="{{url}}">→<img :src="url" :width="50px"> v-on:click可以写成@click <button @click="up()"></button> v-if实例  可以通过对对象操作条件来实现想要展示的效果 <!DOCTYPE html> <html> <he

  • vue.config.js常用配置详解

    使用vue-cli3.0搭建项目比之前更简洁,没有了build和config文件夹. vue-cli3的一些服务配置都迁移到CLI Service里面了,对于一些基础配置和一些扩展配置需要在根目录新建一个vue.config.js文件进行配置 module.exports = { // 选项... } 基本路径 baseUrl从 Vue CLI 3.3 起已弃用使用publicPath来替代. 在开发环境下,如果想把开发服务器架设在根路径,可以使用一个条件式的值 module.exports =

  • 前端路由&webpack基础配置详解

    1. SPA SPA是单页面应用程序(single page application),通俗来讲就是在一个页面开发一个完整网站的功能 优点: 不需要跳转页面,局部更新页面内容 前端组件化 缺点: 首屏加载慢(第一次访问慢,按需加载) 开发复杂(所有的功能都在一个页面完成,可使用webpack模块化开发) 不利于SEO搜索引擎优化(使用服务端渲染) 2. 前端路由: 根据不用的URL标识符渲染不同的组件(不同的网页内容) 路由实现原理: hash哈希(锚点) 通过hashchange监听URL标识

  • Django+Vue跨域环境配置详解

    概述 在使用Django+Vue开发过程中,遇到了很多开发环境相关的问题,比如跨域,比如ajax请求参数等,本篇文章主要记录解决在开发过程中,遇到的一些问题. 跨域不带Cookie 在使用Vue脚手架开发的过程中,会使用Vue脚手架自带的Server进行项目调试,Vue自带的Server支持 hot reloading ,这个特性是非常好用的.但是在开发过程中,因为要与后端交互,所以在请求后端接口的时候,会遇到跨域问题,这个问题在一些职责划分清楚的团队并不存在,因为前端开发人员会才用Mock数据

  • vue px转rem配置详解

    目录 方法一 一.配置与安装步骤: 方法二 方法三 总结 方法一 一.配置与安装步骤: 1.在 Vue 项目的 src 文件夹下创建一个 config 文件夹: 2.在 config 文件夹中创建 rem.js: 3.将以下代码复制到 rem.js 中: // 基准大小 const baseSize = 32 // 设置 rem 函数 function setRem () { // 当前页面宽度相对于 750 宽的缩放比例,可根据自己需要修改. const scale = document.do

  • vue 项目常用加载器及配置详解

    本文介绍了vue 项目常用加载器及配置详解,分享给大家,具体如下: 1.安装sass: 1.1 由于sass-loader依赖于node-sass,所以在安装sass-loader的同时还需安装node-sass npm install --save-dev node-sass npm install --save-dev sass-loader 1.2 安装完成后修改 <style>标签: <style lang="scss"></style> 2

  • Visual Studio 2019配置vue项目的图文教程详解

    一,环境安装 1:Vue项目一切基于Node.js,必须先安装NodeJS, 下载地址:https://nodejs.org/zh-cn/ 安装nodejs,一路next就行了 Additonal工具可以不用安装. win+r 输入cmd 输入 node -v 和 npm -v 得到版本信息证明装好了. 2:确认Visual Studio 2019环境:看扩展工具里有没有勾选NodeJs 二,使用VS2019 创建Vue项目 后期会新增多个vue的项目,所以建议加一个vue名称 方案管理文件 你

  • VSCODE配置Markdown及Markdown基础语法详解

    一,VSCODE配置Markdown 打开左侧的extensions,或者使用 Ctrl+Shift+X,输入Markdown (1)Markdown all in one :是一个组合包,把最常用的Markdown优化都可以安装好. (2)Markdown preview GitHub styling :Github使用的Markdown渲染样式,使用这个样式,在本地就能预览Markdown文件最终在Github Pages中显示的效果. 二,Markdown基础语法 1,VSCODE中新建一

随机推荐