๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Vue

๐Ÿฐ vue2 jest ํ™˜๊ฒฝ์„ธํŒ…

by frontChoi 2023. 8. 9.
๋ฐ˜์‘ํ˜•

๐Ÿš Vue2 jest ํ™˜๊ฒฝ์„ธํŒ… ํ•˜๋Š” ์ด์œ 

์ด๋ฒˆ์— ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋„์ž…ํ•˜๊ธฐ ์•ž์„œ ํ™˜๊ฒฝ์„ธํŒ…์˜ ์ค€๋น„ ํ•„์š”์„ฑ์„ ๋А๊ปด์„œ ๋ธ”๋กœ๊ทธ์— ๋‚จ๊ธฐ๊ณ ์ž ํ•œ๋‹ค.

ํ•ญ์ƒ ํ™˜๊ฒฝ์„ธํŒ…์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ธฐ๋„ ํ–ˆ๋‹ค. ํ™˜๊ฒฝ์„ธํŒ…์€ ์—ฌ๊ธฐ์„œ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

ํ™˜๊ฒฝ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • Node Version : 16.19.1
  • Npm Version : 8.19.3

 

 

โš“๏ธ  ๋ทฐ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

npm install jest  --save-dev
npm install @vue/test-utils@1.3.6 --save-dev
npm install vue-jest --save-dev
npm install babel-jest --save-dev

โš“๏ธ  ๋ทฐ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ (์ˆ˜์ •๋ณธ)

npm install @vue/cli-plugin-unit-jest@5.0.0 --save-dev
npm install @vue/test-utils@1.3.6 --save-dev
npm install @vue/vue2-jest@27.0.0 --save-dev

๐Ÿฏ Babel(2023.08.10) ์ˆ˜์ • 

๋ฐ”๋ฒจ์€ ์ตœ์‹ ๋ฌธ๋ฒ•์„ es5 ์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. jest ๊ด€๋ จํ•˜์—ฌ babel ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

(๋‹น์‹œ ๋ฒ„์ „์˜ ํ˜ธํ™˜์„ฑ์ด ๋งž์ง€ ์•Š์•„ install ํ• ๋•Œ ๋ฒ„์ „์„ ๋ช…์‹œํ•ด์ฃผ์—ˆ๋‹ค.)

npm install babel-core@^7.0.0-bridge.0 --save-dev
npm install babel-jest@27.3.1 --save-dev
npm install @babel/core@7.0.0-bridge.0 --save-dev
npm install @babel/preset-env@7.22.10 --save-dev

vue2์—์„œ babel.config.js์— ์•„๋ž˜์ฒ˜๋Ÿผ ๋˜์–ด์žˆ๋‹ค๋ฉด babel/preset์„ ์„ธํŒ…ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

module.exports = {
  presets: [
    //"@babel/preset-env", ์ˆ˜๋™์„ค์ • ์›ํ•˜๋Š” ๊ฒฝ์šฐ
    '@vue/cli-plugin-babel/preset' //vue cli์—์„œ ์ž๋™์„ค์ •๋จ
  ]
}

 

๐ŸŽข  vue jest ๋ช…๋ น์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€

//vue add unit-jest

 

โœˆ๏ธ jest ์„ค์น˜

npm install jest@27.0.3 --save-dev

๐Ÿš jest.config.js

jest๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” jest ํ™˜๊ฒฝ์„ค์ •์ด ํ•„์š”ํ•˜๊ณ  jest.config.js์—์„œ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

module.exports = {
    preset: '@vue/cli-plugin-unit-jest',
    moduleFileExtensions: [
        "js",
        "json",
        // ๋ชจ๋“  vue ํŒŒ์ผ(`*.vue`)์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Jest์—๊ฒŒ ์•Œ๋ ค์ค๋‹ˆ๋‹ค
        "vue"
    ],
    transform: {
        ".*\\.(vue)$": "@vue/vue2-jest",
        ".*\\.(js)$": "babel-jest",
    },
    moduleNameMapper: {
        // ๋ณ„์นญ @(ํ”„๋กœ์ ํŠธ/src) ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์œ„ ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์„ ๋งตํ•‘ํ•ฉ๋‹ˆ๋‹ค
        '^@/(.*)$': '<rootDir>/src/$1'
    },
    testMatch: [
        // __tests__ ๊ฒฝ๋กœ ํ•˜์œ„์— ์žˆ๋Š” ๋ชจ๋“  js/ts/jsx/tsx ํŒŒ์ผ์„ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค
        "**/__tests__/**/*.[jt]s?(x)",
        // ํŒŒ์ผ ์ด๋ฆ„์— 'xxx.spec' ๋˜๋Š” 'xxx.test'๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์—ฌ์ธ ๋ชจ๋“  js/ts/jsx/tsx ํŒŒ์ผ์„ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค
        "**/?(*.)+(spec|test).[jt]s?(x)"
    ],
    testPathIgnorePatterns: ["/node_modules/"],
    collectCoverage: true,
    collectCoverageFrom: [
        "**/*.{js,vue}",
        "!**/node_modules/**",
        "!**/coverage/**",
        "!**vue.config.js**",
        "!**babel.config.js**",
        "!**jest.config.js**",
    ]
}

 

๐Ÿ›ฉ๏ธ ๋ช…๋ น์–ด ๋“ฑ๋ก

//package.json
{
 "scripts": {
 	"test:unit": "vue-cli-service test:unit"
 }
}

 

๐Ÿšฅ HelloWorld.vue ์ž‘์„ฑ

/*HelloWorld.vue*/
<template>
    <div class="hello">
        hello
    </div>
</template>

<script>
export default {
    name: 'HelloWorld',
}
</script>
<style scoped></style>
//helloworldcomponent.test.js
import { shallowMount } from "@vue/test-utils";
import HelloWorld from '@/components/HelloWorld.vue'
describe('hello world', () => {
    test('test1', async () => {
        const wrapper = shallowMount(HelloWorld);
        expect(wrapper.text()).toBe("hello")
    });
});

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด HelloWorld.vue๊ฐ€ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต๊ณผํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

npm run test:unit

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€