国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Vue-Jest 自動(dòng)化測試基礎配置詳解

發(fā)布時(shí)間:2021-08-17 12:16 來(lái)源: 閱讀:0 作者:Hughes 欄目: JavaScript 歡迎投稿:712375056

目錄

      目前開(kāi)發(fā)大型應用,測試是一個(gè)非常重要的環(huán)節,而在 Vue 項目中做單元測試可以用 Jest,Jest 是 facebook 推出的一款測試框架,集成了 Mocha, chai, jsdom, sinon 等功能,而且在 Vue 的腳手架中已經(jīng)集成了 Jest,所以在 Vue 項目中使用 Jest 做單元測試是不二的選擇,從提供的例子上看都很簡(jiǎn)單地配置并測試成功,然而在實(shí)際項目中有很多差異,我在測試自己的某個(gè)業(yè)務(wù)組件就報出很多錯誤,本文就總結一下自己的踩坑經(jīng)歷,并幫助讀者快速解決配置中出現的問(wèn)題。

      安裝

      可以通過(guò)官方提供的 @vue/cli 直接創(chuàng )建 Vue 項目,然后選中 Unit Testing 這個(gè)選項

      ? 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 配置文件長(cháng)這樣,好像在告訴我們,我都給你們設置好了,直接用吧,然而針對項目,還需要手動(dòng)去配置兼容,要不然會(huì )報出很多錯誤,無(wú)法進(jìn)行下去。

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

      配置

      先看看這個(gè)預設配置到底寫(xiě)了什么,找到 @vue/cli-plugin-unit-jest/presets/typescript-and-babel 這個(gè)包,實(shí)際上這個(gè)輸出的配置如下:

      module.exports = {
        moduleFileExtensions: [ // 測試的文件類(lèi)型
          '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/'],  // 轉化時(shí)忽略 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
          }
        }
      }
      

      其中比較重要的配置,也是我們比較多用來(lái)解決問(wèn)題的配置:

      • moduleFileExtensions : 測試的文件類(lèi)型,這里默認的配置基本涵蓋了文件類(lèi)型,所以這里一般不需要改
      • transform : 轉化方式,匹配的文件要經(jīng)過(guò)轉譯才能被識別,否則會(huì )報錯。
      • transformIgnorePatterns : 轉化忽略配置
      • moduleNameMapper : 模塊別名,如果有用到都要填寫(xiě)進(jìn)去

      常見(jiàn)錯誤

      SyntaxError : 語(yǔ)法錯誤,很可能是因為沒(méi)有進(jìn)行轉化,比如下面的提示:

       /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'

      由于我們沒(méi)有對 .mjs 文件進(jìn)行轉換導致了報錯,最快的解決方式就是在 transform 補充 .mjs 的轉化

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

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

      另一種語(yǔ)法錯誤,是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  的配置忽略了轉化,從而導致語(yǔ)法錯誤。解決方法就是改變 transformIgnorePatterns  的配置,如下:

      transformIgnorePatterns: [
          // 轉化時(shí)忽略 node_modules,但不包括 vue-runtime-helpers
          '/node_modules/(?!(vue-runtime-helpers)/)',
        ],
      

      將 vue-runtime-helpers 排除后,轉化的時(shí)候就不會(huì )忽略它,從而解決語(yǔ)法報錯的問(wèn)題。

      Ts 類(lèi)型錯誤

       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"
          ],
        }
      }

      測試前的工作

      在編寫(xiě)測試用例前,我們需要 Jest 提供組件實(shí)例 vm 和渲染的 DOM 結構。對代碼邏輯、頁(yè)面效果的雙重測試保障,那么如何獲取到這個(gè)業(yè)務(wù)組件?

      直接引用組件是不行的,因為你的業(yè)務(wù)組件需要的依賴(lài)很多,比如 UI 組件庫、工具函數、Vuex 的狀態(tài)等,所以首先我們需要處理好這些依賴(lài)。

      處理依賴(lài)

      首先要知道要測試的這個(gè)業(yè)務(wù)組件依賴(lài)了哪些東西,全局的依賴(lài)可以參照 main.ts 或 main.js 入口文件處,其他可根據組件中的引用來(lái)判斷。有了依賴(lài)后如何在 Jest 中獲得組件實(shí)例?

      Vue 提供了一個(gè)單元測試實(shí)用工具庫 - ,編寫(xiě)測試用例的時(shí)候可以用到它,首先利用 createLocalVue 創(chuàng )建一個(gè) Vue 的類(lèi)供你添加組件、混入和安裝插件而不會(huì )污染全局的 Vue 類(lèi), 接著(zhù)將依賴(lài)引用進(jìn)去。

      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;
      

      這樣就拿到了一個(gè)包含依賴(lài)的 Vue 類(lèi),接著(zhù)處理 Vuex,比如我們需要枚舉值

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

      生成實(shí)例和 DOM

      在得到 localVue 和 store 之后,我們要用它去生成結果,通過(guò) mount 將組件渲染出來(lái)。

      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'; // 引用要測試的業(yè)務(wù)
      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; // 組件實(shí)例
          console.log(html, vm);
        })
      }
      
      

      將 localVue 和 store,通過(guò) mount 最終得到實(shí)例和它的 DOM 結構。接下來(lái)就可以根據實(shí)例和 DOM 去編寫(xiě)自己的測試用例啦。

      總結

      本文主要介紹了在 Vue + Ts 項目中配置 Jest 自動(dòng)化測試中遇到的問(wèn)題總結,介紹基本配置和常見(jiàn)錯誤的解決方法,以及如何在開(kāi)始編寫(xiě)測試用例前得到完整的組件信息和 DOM。為接下來(lái)的用例編寫(xiě)打下基礎。

      引用


      到此這篇關(guān)于Vue-Jest 自動(dòng)化測試基礎配置詳解的文章就介紹到這了,更多相關(guān)Vue-Jest 自動(dòng)化測試內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

      免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

      国产精品天天看天天狠| 国产精品青青青在线观看| 撸啊撸视频在线观看| 成年男女免费视频网站| 美女裸体视频全免费| 国产丰满麻豆VIDEOSSEXHD|