Vue

🏰 vue2 jest ν™˜κ²½μ„ΈνŒ…

frontChoi 2023. 8. 9. 07:41
λ°˜μ‘ν˜•

🚁 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

λ°˜μ‘ν˜•