--- tags: JEST --- # JEST 安裝 ## VUE-CLI 3 安裝方式 ```shell= vue add unit-jest ``` ## VUE-CLI 2 安裝方式 * 安裝 Jest ```shell= // npm $ npm install --save-dev babel-jest $ npm install --save-dev babel-plugin-dynamic-import-node $ npm install --save-dev babel-plugin-transform-es2015-modules-commonjs $ npm install --save-dev jest jest-serializer-vue jest-watch-typeahead $ npm install --save-dev @vue/test-utils vue-jest ``` * 然後我們需要在 package.json 中定義一个單元測試的腳本。 ```javascript= // package.json { "scripts": { "unit": "jest --config test/unit/jest.conf.js --coverage", "test": "npm run unit" } } ``` * 修改 Babel 配置 ```javascript= // .babelrc { // 沿用原本配置 "presets": [...], // 增加 env 區塊 "env": { "test": { "presets": ["env", "stage-2"], "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"] } } } ``` * 接下来在 根目錄 中創見一個 jest 區塊: * /test/unit/.eslintrc ```javascript= { "env": { "jest": true }, "globals": {} } ``` * /test/unit/jest.conf.js ```javascript= const path = require('path') module.exports = { // Indicates whether each individual test should be reported during the run. // All errors will also still be shown on the bottom after execution. verbose: true, rootDir: path.resolve(__dirname, '../../'), moduleFileExtensions: ['js', 'json', 'vue'], // 如果你在 webpack 中配置了别名解析,比如把 @ 设置为 /src 的别名,那麼你也需要用 moduleNameMapper 選項為 Jest 增加一个匹配配置: moduleNameMapper: { '^@/(.*)$': '<rootDir>/src/$1', }, transform: { '^.+\\.js$': '<rootDir>/node_modules/babel-jest', // 用 `babel-jest` 處理 js '.*\\.(vue)$': '<rootDir>/node_modules/vue-jest', // 用 `vue-jest` 處理 `*.vue` 文件 '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/fileTransformer.js', }, // 自定義的序列化工具改進被保存的快照 snapshotSerializers: ['<rootDir>/node_modules/jest-serializer-vue'], setupFiles: ['<rootDir>/test/unit/setup'], // 測試覆蓋率 coverageDirectory: '<rootDir>/test/unit/coverage', collectCoverageFrom: [ 'src/**/*.{js,vue}', '!src/main.js', '!src/router/index.js', '!**/pwa/**', '!**/assets/**', '!**/node_modules/**', ], testMatch: ['**/test/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'], testEnvironment: 'jsdom', testURL: 'http://localhost/', } ``` * /test/unit/setup.js ```javascript= import Vue from 'vue' Vue.config.productionTip = false ``` * /test/unit/specs/HelloWorld.spec.js ```javascript= import { shallowMount } from '@vue/test-utils' // The component to test const MessageComponent = { template: '<p>{{ msg }}</p>', props: ['msg'], } test('displdays message', () => { // mount() returns a wrapped Vue component we can interact with const wrapper = shallowMount(MessageComponent, { propsData: { msg: 'Hello world', }, }) // Assert the rendered text of the component expect(wrapper.text()).toContain('Hello world') }) ``` * support images add /fileTransformer.js ```javascript= const path = require('path') module.exports = { process(src, filename, config, options) { return 'module.exports = ' + JSON.stringify(path.basename(filename)) + ';' }, } ``` ### 修正 VSCODE JEST 套件無法直接 debuger * 修改 package.json 中的单元测试的腳本 VSCODE 的 JEST 套件 抓取 jest 配置於根目錄 ```javascript= // package.json { "scripts": { "unit": "jest --config jest.config.js --coverage", //"unit": "jest --config test/unit/jest.conf.js --coverage", "test": "npm run unit" } } ``` * 修改 /test/unit/jest.conf.js -> /jest.config.js ```javascript= const path = require('path') module.exports = { // Indicates whether each individual test should be reported during the run. // All errors will also still be shown on the bottom after execution. verbose: true, //rootDir: path.resolve(__dirname, '../../'), // 不需要指定根目錄 moduleFileExtensions: ['js', 'json', 'vue'], // 如果你在 webpack 中配置了别名解析,比如把 @ 设置为 /src 的别名,那麼你也需要用 moduleNameMapper 選項為 Jest 增加一个匹配配置: moduleNameMapper: { '^@/(.*)$': '<rootDir>/src/$1', }, transform: { '^.+\\.js$': '<rootDir>/node_modules/babel-jest', // 用 `babel-jest` 處理 js '.*\\.(vue)$': '<rootDir>/node_modules/vue-jest', // 用 `vue-jest` 處理 `*.vue` 文件 '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/fileTransformer.js', }, // 自定義的序列化工具改進被保存的快照 snapshotSerializers: ['<rootDir>/node_modules/jest-serializer-vue'], setupFiles: ['<rootDir>/test/unit/setup'], // 測試覆蓋率 coverageDirectory: '<rootDir>/test/unit/coverage', collectCoverageFrom: [ 'src/**/*.{js,vue}', '!src/main.js', '!src/router/index.js', '!**/pwa/**', '!**/assets/**', '!**/node_modules/**', ], testMatch: ['**/test/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'], testEnvironment: 'jsdom', testURL: 'http://localhost/', } ```