成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Vue-Jest 自動化測試基礎配置詳解

瀏覽:128日期:2022-09-28 10:35:33
目錄安裝配置常見錯誤測試前的工作處理依賴生成實例和 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 config 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不支持IntersectionObserverimport 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 自動化測試內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产资源在线一区| 激情久久五月天| 国产在线精品一区二区夜色| 久久亚洲一区二区三区明星换脸| 影音先锋久久久| 国产成人av一区二区| 亚洲欧洲综合另类在线| 欧美军同video69gay| 中文亚洲免费| 欧美黄色精品| 无码av中文一区二区三区桃花岛| 欧美精品一区二区三区蜜桃| 91激情在线视频| 国产精品九九| 成人av网站在线| 日本欧美一区二区| 亚洲美女视频在线观看| 国产亚洲人成网站| 5月丁香婷婷综合| 久久综合导航| 久久国产精品久久久久久电车| 欧美在线日韩| 风间由美中文字幕在线看视频国产欧美| 亚洲最大成人综合| 亚洲色欲色欲www在线观看| 日韩三级免费观看| 色8久久精品久久久久久蜜| 亚洲在线观看| 久久成人亚洲| 免费亚洲网站| 久久精品30| 亚洲婷婷国产精品电影人久久| 国产成人精品一区二| 久久影音资源网| 国内精品视频在线播放| 一区二区三区 在线观看视频| 性伦欧美刺激片在线观看| 五月天国产精品| 色一情一伦一子一伦一区| 美女在线观看视频一区二区| 欧美三电影在线| 激情综合网最新| 久久精品一区八戒影视| 欧美成人官网二区| wwwwxxxxx欧美| 26uuu色噜噜精品一区| 欧美精品粉嫩高潮一区二区| 欧美视频一区在线| 欧美成人猛片aaaaaaa| 日韩午夜电影av| 精品精品国产高清一毛片一天堂| 69堂精品视频| 久久综合五月天婷婷伊人| 国产欧美精品日韩区二区麻豆天美| 国产日韩欧美不卡| 国产色婷婷亚洲99精品小说| 国产精品污www在线观看| 国产精品高潮呻吟| 一区二区国产视频| 午夜精品久久久久久久久| 亚洲高清一区二区三区| 无码av中文一区二区三区桃花岛| 婷婷中文字幕综合| 国产毛片精品视频| 91麻豆.com| 久久狠狠一本精品综合网| 欧美视频自拍偷拍| 久久精品在这里| 亚洲精品乱码久久久久久| 亚洲乱码日产精品bd| 午夜欧美视频在线观看| 免费成人美女在线观看.| 国产麻豆午夜三级精品| 色综合中文字幕国产| 成人动漫中文字幕| 影音先锋一区| 欧美日韩国产高清一区二区三区 | 亚洲精品一区二区三区在线观看 | 国产精品一区视频网站| 欧美久久一二区| 欧美精品一区二区高清在线观看| 中文字幕va一区二区三区| 日本不卡一区二区| 欧美在线视频一区二区三区| 久久蜜桃资源一区二区老牛| 欧美精品一区二区三区在线| 亚洲成人免费av| 777午夜精品视频在线播放| 欧美在线一二三区| 日本美女一区二区| 国产精品久久精品日日| 欧美日韩国产首页| 亚洲精品乱码久久久久久蜜桃麻豆| 黄页网站大全一区二区| 国产精品美女一区二区三区| 色先锋aa成人| 国产尤物精品| 国产在线看一区| 亚洲精品成人悠悠色影视| 91精品国产一区二区三区香蕉| 在线综合欧美| 99r国产精品| 美女视频黄 久久| 中文字幕色av一区二区三区| 91影院在线观看| 久久精品国产综合精品| 国产精品免费aⅴ片在线观看| 丁香啪啪综合成人亚洲小说 | 欧美一区二区黄色| 亚洲va在线va天堂| 伊人天天综合| 中文字幕免费不卡| 91在线一区二区| 日韩精品中文字幕在线一区| 久久电影网电视剧免费观看| 一本一本a久久| 国产精品视频麻豆| www..com久久爱| 欧美一区二区播放| 久久99精品国产麻豆婷婷| 色婷婷精品大视频在线蜜桃视频| 一区二区三区欧美激情| bt欧美亚洲午夜电影天堂| 欧美三级电影精品| 日韩成人av影视| 一本大道久久a久久综合| 亚洲大片一区二区三区| 国产亚洲精品v| 亚洲国产成人porn| 欧美一级视频| 青娱乐精品视频在线| 久久国产精品高清| 五月婷婷激情综合| 欧美亚洲专区| 蜜臂av日日欢夜夜爽一区| 欧美视频日韩视频在线观看| 美女视频一区在线观看| 久久久久网址| 另类欧美日韩国产在线| 欧美日韩一级黄| 国产精品亚洲а∨天堂免在线| 欧美一区二区成人6969| 99精品视频在线观看免费| 久久精品亚洲国产奇米99| 欧美精品一区三区在线观看| 国产精品毛片高清在线完整版| 国内自拍视频一区二区三区| 中文字幕乱码日本亚洲一区二区| 欧美视频在线观看| 亚洲高清久久久| 欧美日本一道本在线视频| 成人黄动漫网站免费app| 精品国产乱码久久久久久闺蜜 | 日韩精品一区二区三区中文不卡| 国产剧情一区二区三区| 日韩女优视频免费观看| av一区二区三区黑人| 国产精品免费av| 噜噜爱69成人精品| 国产一区二区调教| 国产亚洲欧洲997久久综合 | 一区二区三区高清不卡| 国产区日韩欧美| 视频精品一区二区| 6080亚洲精品一区二区| 99re成人在线| 性欧美大战久久久久久久久| 欧美三级在线| 国语对白精品一区二区| 欧美日韩视频| 韩日精品在线| 一区三区视频| 99亚洲视频| 久久国产高清| 欧美图区在线视频| 欧美人与禽zozo性伦| 这里只有精品视频在线观看| 欧美日韩国产天堂| 欧美一级淫片007| 欧美变态tickling挠脚心| 精品国产免费人成在线观看| 99国内精品久久| 亚洲成人免费看| 国产夜色精品一区二区av| 久久精品99| 国产精品国产精品| 激情综合色综合久久| 国产精品麻豆视频| 欧美一区二区三区四区五区| 国产一区二区三区的电影| 成人夜色视频网站在线观看| 亚洲自拍偷拍av| 欧美不卡一区二区三区| 91成人在线精品| 亚洲黄色成人久久久| 国产精品1区2区| 麻豆国产欧美一区二区三区| 亚洲欧洲精品天堂一级| 精品国产1区二区| 欧美喷水一区二区|