๊ธฐ๋ฅ ์ ์์ฒญํ๊ฑฐ๋ ๋ฒ๊ทธ ๋ฅผ ๋ณด๊ณ ํ์๊ฒ ์ต๋๊น?
๋ฒ๋
ํ์ฌ ํ๋์ ๋ฌด์์
๋๊น?
app.jsx
์ import './app.css';
๊ฐ ์์ผ๋ฉด ํ
์คํธ๋ฅผ ์คํํ ์ ์์ผ๋ฉฐ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
yarn run:test v0.21.3
$ NODE_ENV=client jest -u
FAIL src/__tests__/app.test.js
โ Test suite failed to run
/home/svipben/Documents/react-boilerplate/src/client/app/app.css:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){body {
^
SyntaxError: Unexpected token {
at transformAndBuildScript (node_modules/jest-runtime/build/transform.js:320:12)
at Object.<anonymous> (src/client/app/app.jsx:7:1)
at Object.<anonymous> (src/__tests__/app.test.js:2:12)
Test Suites: 1 failed, 1 total
Tests: 0 total
Snapshots: 0 total
Time: 0.693s
Ran all test suites.
error Command failed with exit code 1.
์์๋๋ ๋์์ ๋ฌด์์
๋๊น?
์ค๋ฅ ์์ด ํ
์คํธ๋ฅผ ์คํํ๋ ค๋ฉด...
์ ํํ Jest ๊ตฌ์ฑ์ ์ ๊ณตํ๊ณ Jest, ๋ ธ๋, yarn/npm ๋ฒ์ ๋ฐ ์ด์ ์ฒด์ ๋ฅผ ์ธ๊ธํ์ญ์์ค.
OS: ๋ฆฌ๋
์ค ์ฐ๋ถํฌ 16.04
๋๋ด: ์ต์
์์ฌ: ์ต์
๋
ธ๋: ์ต์
babel-jest
: ์ต์
.babelrc:
"client": {
"presets": [
"latest", // All you need to compile what's in ES2015+
"flow", // Flow support
"react", // Strip flow types and transform JSX
"stage-2" // Experimental syntax extensions
],
"sourceMaps": true // Compile with Source Maps
},
๋๋ด: NODE_ENV=ํด๋ผ์ด์ธํธ ๋๋ด -u
์ถ์ import './app.css';
์ ๋๊ธ์ ๋ฌ๊ฑฐ๋ ์ ๊ฑฐํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์คํ๋ฉ๋๋ค.
@svipben https://facebook.github.io/jest/docs/webpack.html#mocking -css-modules
@maximderbin ๊ฐ์ฌํฉ๋๋ค!
@maximderbin ๊ฐ์ฌํฉ๋๋ค! moduleNameMapper
๋ฅผ ์ถ๊ฐํ์ฌ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
@svipben @maximderbin @simonxl ์ด moduleNameMapper๋ฅผ ์ด๋์ ์ถ๊ฐํด์ผ ํ๋์?
๋๋ ๋ฌธ์์์ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ packag.json์ ์ถ๊ฐํ ๊ฒ์ด์ง๋ง ์ด๋ ๊ฒ์ ๋ณผ ๊ฒ์ธ๊ฐ?
tnx
@sarahmarciano moduleNameMapper
๋ ๊ตฌ์ฑ์ ์ผ๋ถ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด "jest" ํค ์๋์ package.json(์ข
์์ฑ์์ jest ๊ธฐ๋ฅ์ด ์๋ ๊ฒ)์ ๊ตฌ์ฑ์ ์ค์ ํ ์ ์์ต๋๋ค.
{
"dependencies": {...}
"jest": {
"moduleNameMapper": {...}
}
}
package.json ํ์ผ์ jest ๊ตฌ์ฑ์์ moduleNameMapper
ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
{
"jest":{
"moduleNameMapper":{
"\\.(css|less|sass|scss)$": "<rootDir>/__mocks__/styleMock.js",
"\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js"
}
}
}
๊ทธ๋ฐ ๋ค์ ์๋ ์ค๋ช ๋ ๋๋ก ๋ ๊ฐ์ ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
__mocks__/styleMock.js
module.exports = {};
__mocks__/fileMock.js
module.exports = 'test-file-stub';
CSS ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ className ์กฐํ๋ฅผ ํ์ฑํํ๊ธฐ ์ํด ํ๋ก์๋ฅผ ์กฐ๋กฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฐ๋ผ์ ๊ตฌ์ฑ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
{
"jest":{
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(css|less|scss|sass)$": "identity-obj-proxy"
},
}
}
๊ทธ๋ฌ๋ ๊ฐ๋ฐ์ ์ข
์์ฑ์ผ๋ก identity-obj-proxy
ํจํค์ง๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
yarn add identity-obj-proxy -D
์์ธํ ๋ด์ฉ์. jest ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ถ์ฅํ๋ ์ ๊ทผ ๋ฐฉ์์ CSS ๋ชจ๋์ด JSX ํ์ผ์ด ์์กดํ๋ ๊ฐ์ ๋ด๋ณด๋ด๋ ๊ฒฝ์ฐ ์๋ํ์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฐ์ด๋๋ ํด๋์ค ์ด๋ฆ์ ๋ด๋ณด๋ด๋ ๋ฐ CSS ๋ชจ๋๋ง ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. CSS ๋ชจ๋์ ์ ๋๋ก ์กฐ๋กฑํ๊ธฐ ์ํ ๊ฐ์ด๋๊ฐ ์์์ผ๋ฉด ํฉ๋๋ค.
@matthew-dean "CSS ๋ชจ๋์ ์ ์ ํ๊ฒ ์กฐ๋กฑ"ํ๋ค๋ ๊ฒ์ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์กฐ๊ธ ๋ ์ค๋ช
ํ ์ ์์ต๋๊น? identity-obj-proxy
๋ฅผ ์ฌ์ฉํ ๊ฒฝํ์ด ์์ต๋๋ค.
:export {
sizeMobile: $size-mobile / 1px;
sizePhablet: $size-phablet / 1px;
sizeSmallTablet: $size-small-tablet / 1px;
sizeTablet: $size-tablet / 1px;
sizeDesktop: $size-desktop / 1px;
sizeLargeDesktop: $size-large-desktop / 1px;
}
import styles from './variables.scss'
const tileSize = parseFloat(styles.sizeTablet) / 3
//...
render() {
return <Tile style={{width: tileSize}} />
}
์ด๊ฒ์ CSS ๋ชจ๋๊ณผ JS ๊ฐ์ ์์(๊ฐ)๋ฅผ ๊ณต์ ํ ์ ์๊ณ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์กฐ๊ฑด๋ถ ๋ ๋๋ง ๋๋ ๋์ props๋ฅผ ํ ๋นํ ์ ์์์ ๋ณด์ฌ์ฃผ๋ ์ธ์์ ์ธ ์์ ๋๋ค.
๊ทธ๋ฌ๋ identity-obj-proxy
๋ฅผ ์ฌ์ฉํ๋ฉด ์กด์ฌํ๋ ์ค์ ๊ฐ์ ๊ณ ์ฌํ๊ณ ์ด๋ฌํ ๊ฐ์ ์ ์๋ก ๋ณํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ CSS ๋ชจ๋์ ์ ์๋ ์์์ ์์กดํ๋ JSX ์ฝ๋๊ฐ ์๋ ๊ฒฝ์ฐ CSS ๋ชจ๋์ ์ ์ ํ๊ฒ ์กฐ๋กฑํ์ง ์๊ณ ๋ ์ด๋ฅผ ํ
์คํธํ ์ ์์ต๋๋ค(๊ฐ์ด ํ
์คํธ ๊ฐ๋ฅํ ์ ์๋ก ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง). identity-obj-proxy
๋ CSS ๋ชจ๋์ ๋ฒ์๊ฐ ์ง์ ๋ CSS ํด๋์ค ์ด๋ฆ๋ง ์๋ ๊ฐ์ฒด๊ฐ ํฌํจ๋์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๊ฒ์ JS ์์
์์ ์ฐจ๋ก๋ก ์ฌ์ฉ๋๋ ๊ฐ/์์๋ฅผ ๋ด๋ณด๋ด๋ ๊ธฐ๋ฅ์ธ CSS ๋ชจ๋์ ๋ค๋ฅธ ์ธก๋ฉด์ ์ง์ํ์ง ์์ต๋๋ค.
@SimenB
๋ง๋ถ์ฌ์, ๋๋ ๋ค์๊ณผ ๊ฐ์ด CSS ๋ชจ๋์ ์ฑ๊ณต์ ์ผ๋ก ์กฐ๋กฑํ ์ ์์์ต๋๋ค.
const styles = require('styles/variables.scss')
jest.mock('styles/variables.scss', () => {
return {
sizePhablet: 500,
sizeSmallTablet: 768,
sizeTablet: 1024,
sizeDesktop: 1440,
sizeLargeDesktop: 1920
}
})
CSS ๋ชจ๋์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์๊ณ ๋์ฒ๋ผ ๊ธฐ๋ณธ " identity-obj-proxy
์ฌ์ฉ" ์กฐ์ธ์ ๋ฌด์ํ๊ณ ์๋ ๋ค๋ฅธ ๋๊ตฐ๊ฐ์๊ฒ ์ด๊ฒ์ด ์ ์ฉํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
'jest-transform-css'๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์ค์น ํ jest config.xml์ ์๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
"transform": {
"^.+\\.js$": "babel-jest",
".+\\.(css|styl|less|sass|scss)$": "jest-transform-css"
}
์ด์ css ํ์ผ์ js ํ์ผ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํธ๋์คํ์ผ๋ฉ๋๋ค.
@matthew-dean ๋ชจ์ CSS ๋ชจ๋์ ์ด๋์์ ์์ฑํ์ผ๋ฉฐ jest์ ์ด๋ป๊ฒ ์ฐธ์กฐํฉ๋๊น?
์ธ๋ถ ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋ค์์ ์ฌ์ฉํ์ฌ ์์ฒด ํ์ผ์ ๋จ์ผ ํ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค.
<strong i="6">@import</strong> "progress-tracker/progress-tracker-variables.scss";
ํ
์คํธ๋ฅผ ์์ํ๊ธฐ ์ํด Jest๋ฅผ ์คํํ ๋๋ง๋ค
์์ ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค. ๋๋ ์ด๋ฏธ package.json ์์ css ๋ชจํ์ ์ง์ ํ์ต๋๋ค.
ํด๋น ๋ฌธ์ ์ ๋ํด ๋์์ ๋ฐ๊ธฐ๋ฅผ ๊ณ ๋ํ๊ณ ์์ต๋๋ค. ์ด๋ค ํธ๋ฆญ, ์ ์?
ํธ์ง: babel-jest ๋ฐ identity-obj-proxy ํจํค์ง๋ฅผ ๋ชจ๋ ์๋ํ์ง๋ง ๊ทธ ์ค ์๋ฌด ๊ฒ๋ ์๋ํ์ง ์์์ต๋๋ค. ๋ฌธ์ ๋ ์ฌ์ ํ ์ง์๋ฉ๋๋ค.
ํธ์ง 2: ๋ํ ์น์์ ๋ณธ ์๋ฃจ์
์ ๋ฐ๋ผ ์๋ ๊ตฌ์ฑ์ ์๋ํ์ต๋๋ค.
๋๋ Babel 7
, babel-jest ^24.5.0
, Jest ^24.1.0
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์์ ์กฐ์ธ์ ๋ฐ๋ฅธ ํ์๋ ๋์ ํ์ผ(์: Post.test.js
import
Post.js
) CSS ํ์ผ์ ๊ฐ์ ธ์ต๋๋ค(์: ./postStyles.css
.
Jest encountered an unexpected token
SyntaxError: Unexpected token .
Details:
/Users/ben/Desktop/Work/code/bengrunfeld/src/front-end/components/Post/postStyles.css:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){.post h1, .post h2, .post h3 {
3 |
4 | import { PostText } from './styles'
> 5 | import './postStyles.css'
์์ ๋งํฌ๋ ๊ธฐ์ฌ์ ๋ฐ๋ฅด๋ฉด ์ด๊ฒ์ package.json
์ ์์ต๋๋ค.
"jest": {
"moduleFileExtensions": ["js", "jsx"],
"moduleDirectories": ["node_modules", "bower_components", "shared"],
"moduleNameMapper": {
"\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js",
"\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js",
"^react(.*)$": "<rootDir>/vendor/react-master$1",
"^config$": "<rootDir>/configs/app-config.js"
}
},
๋ฃจํธ ๋๋ ํ ๋ฆฌ์๋ ๋ค์ ์ฝ๋๊ฐ ์๋ __mocks__/styleMock.js
๊ฐ ์์ต๋๋ค.
module.exports = {};
๋ง์ง๋ง์ผ๋ก ๋ด jest.config.js
:
module.exports = {
setupFiles: ['<rootDir>/src/test/setup.js']
}
์ฐจ๋ก๋ก Enzyme์ ๊ตฌ์ฑํฉ๋๋ค.
import Enzyme from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'
Enzyme.configure({ adapter: new Adapter() })
๋ด scs ํ์ผ์ @import ๋ฌธ์ด ํฌํจ๋ ๊ฑฐ์ ๋์ผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ณ ๊ตฐ๋ถํฌํ๊ณ ์์ต๋๋ค. SyntaxError: ์ ํจํ์ง ์๊ฑฐ๋ ์๊ธฐ์น ์์ ํ ํฐ์ ์๋ ค์ฃผ๋ ํ
์คํธ์ ์คํจํ์ต๋๋ค. ๋๊ตฐ๊ฐ ๋๋ฅผ ๋์์ค ์ ์์ต๋๊น?
์์ ์ ๊ณต๋ ์๋ฃจ์ ์ ๋ฐ๋์ง๋ง ๊ทธ ์ค ์ด๋ ๊ฒ๋ ๋๋ฅผ ์ํด ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@babel/polyfill
๋ฅผ ๊ฐ๋ฐ ์ข
์์ฑ์ผ๋ก ์ถ๊ฐํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
@fthomas82๋ ๋ง์ฐฌ๊ฐ์ง
package.json ํ์ผ์ jest ๊ตฌ์ฑ์์
moduleNameMapper
ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.{ "jest":{ "moduleNameMapper":{ "\\.(css|less|sass|scss)$": "<rootDir>/__mocks__/styleMock.js", "\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js" } } }
๊ทธ๋ฐ ๋ค์ ์๋ ์ค๋ช ๋ ๋๋ก ๋ ๊ฐ์ ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
__mocks__/styleMock.js
module.exports = {};
__mocks__/fileMock.js
module.exports = 'test-file-stub';
CSS ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ className ์กฐํ๋ฅผ ํ์ฑํํ๊ธฐ ์ํด ํ๋ก์๋ฅผ ์กฐ๋กฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฐ๋ผ์ ๊ตฌ์ฑ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.{ "jest":{ "moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js", "\\.(css|less|scss|sass)$": "identity-obj-proxy" }, } }
๊ทธ๋ฌ๋ ๊ฐ๋ฐ์ ์ข ์์ฑ์ผ๋ก
identity-obj-proxy
ํจํค์ง๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.yarn add identity-obj-proxy -D
์์ธํ ๋ด์ฉ์. jest ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค. ๊ฐ์ฌ ํด์!!!
'jest-transform-css'๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์ค์น ํ jest config.xml์ ์๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค."transform": { "^.+\\.js$": "babel-jest", ".+\\.(css|styl|less|sass|scss)$": "jest-transform-css" }
์ด์ css ํ์ผ์ js ํ์ผ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํธ๋์คํ์ผ๋ฉ๋๋ค.
๊ณ ๋ง์, ํ @krajasekhar
๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค ๐
๋๋ packages.json
์ ์ ์๋ ๊ตฌ์ฑ์ ์ถ๊ฐํ์ง๋ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ jest.config.js
๊ฐ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. Jest๋ packages.json
์ด์์ ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉํฉ๋๋ค.
์ฐธ๊ณ ๋ก ์ฌ๊ธฐ ๋ด jest.config.js
ํ์ผ์ด ์์ต๋๋ค.
module.exports = {
setupFilesAfterEnv: ['<rootDir>/.setup-tests.js'],
testPathIgnorePatterns: ['<rootDir>/.next/', '<rootDir>/node_modules/'],
transform: {
'^.+\\.js$': 'babel-jest',
'.+\\.(css|styl|less|sass|scss)$': 'jest-transform-css',
},
};
๋ด ์ฝ๋์์ ์์ CSS๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
import "./cloud.css?raw"
๋๋ ๋ํ jest ๊ตฌ์ฑ์ ์์ ํ๋ค.
"jest":{
"moduleNameMapper": {
"\\.(css|less|scss|sass|css?raw)$": "identity-obj-proxy"
},
๊ทธ๋๋ ๊ฐ์ ธ์ค๊ธฐ ๋ผ์ธ์์ ํ ์คํธ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์กฐ๋กฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
@import ์๊ธฐ์น ์์ ํ ํฐ์ ์๋ฃจ์ =:)
ํจํค์ง ์ค์น:
npm i --save-dev identity-obj-proxy
jest.config.js์ ์ถ๊ฐ
module.exports = {
"moduleNameMapper": {
"\\.(css|less|scss)$": "identity-obj-proxy"
}
}
๋๊ตฐ๊ฐ ์ฌ๊ธฐ์ ๋์ฐฉํ๋ฉด:
์ด ๋ชจ๋์ ๋ด๊ฐ ๋ณธ ๊ฒ ์ค ๊ฐ์ฅ ์
๋ฐ์ดํธ๋์์ต๋๋ค: https://www.npmjs.com/package/jest-css-modules-transform
transform: {
'^.+\\.(js|jsx|ts|tsx)$': '<rootDir>/node_modules/babel-jest',
".+\\.(css|styl|less|sass|scss)$": "jest-css-modules-transform"
},
transformIgnorePatterns: [
'/node_modules/',
'^.+\\.module\\.(css|sass|scss)$',
],
moduleNameMapper: {
'^.+\\.module\\.(css|sass|scss)$': 'identity-obj-proxy'
},
๋๋
packages.json
์ ์ ์๋ ๊ตฌ์ฑ์ ์ถ๊ฐํ์ง๋ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์jest.config.js
๊ฐ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. Jest๋packages.json
์ด์์ ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉํฉ๋๋ค.์ฐธ๊ณ ๋ก ์ฌ๊ธฐ ๋ด
jest.config.js
ํ์ผ์ด ์์ต๋๋ค.module.exports = { setupFilesAfterEnv: ['<rootDir>/.setup-tests.js'], testPathIgnorePatterns: ['<rootDir>/.next/', '<rootDir>/node_modules/'], transform: { '^.+\\.js$': 'babel-jest', '.+\\.(css|styl|less|sass|scss)$': 'jest-transform-css', }, };
์๋ฃจ์ ์ ์ ์ํ ๋ชจ๋ ์ฌ๋๊ณผ ํน๋ณํ @Shadoow์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ผ์ข ์ ๋ ผ๋ฆฌ์์ผ๋... config ํ์ผ์ด package.json์ ์ค์ ๋ณด๋ค ์ฐ์ ์ฌ์ฉ๋๋ค๋ ์ ์ ๋์น๊ณ ์์์ต๋๋ค.
์์ปจ๋, ์๋ก ์จ ์ฌ๋๋ค์๊ฒ ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์๋ ๊ฒ์ ์ปค๋ฎค๋ํฐ ๋๋ฆผ ํ์ด ์ ์ํ ์ฌ๋ฌ ์๋ฃจ์ ์ ์กฐํฉ์ด์์ต๋๋ค.
1) jest.config.json ํ์ผ ์์ฑ
touch jest.config.json
open jest.config.json
2) jest-transform-css๋ฅผ ์ค์นํฉ๋๋ค.
yarn add jest-transform-css -D
3) jest ๊ตฌ์ฑ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
module.exports = {
preset: 'ts-jest/presets/js-with-babel',
moduleNameMapper: {
'\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)$': './jest.mock.js',
},
setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
testPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/assets/'],
transform: {
'^.+\\.jsx?$': 'babel-jest',
'\\.(css|less|scss|sass)$': 'jest-transform-css',
},
};
4) package.json์ ์ ๋ฐ์ดํธํ์ญ์์ค(๋จผ์ ๋ชจ๋ JEST ๊ตฌ์ฑ์ด ์๋ ๊ฒฝ์ฐ ์ jest ๊ตฌ์ฑ ํ์ผ๋ก ์ ์ก). ๊ทธ๋ฌ๋ฉด ๋ง๋ฒ์ด ์ฌ๊ธฐ์ ์ ์ฉ๋ฉ๋๋ค.
"test": "jest --config ./jest.config.js"
Tks ๋ชจ๋!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
package.json ํ์ผ์ jest ๊ตฌ์ฑ์์
moduleNameMapper
ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.๊ทธ๋ฐ ๋ค์ ์๋ ์ค๋ช ๋ ๋๋ก ๋ ๊ฐ์ ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
__mocks__/styleMock.js
__mocks__/fileMock.js
CSS ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ className ์กฐํ๋ฅผ ํ์ฑํํ๊ธฐ ์ํด ํ๋ก์๋ฅผ ์กฐ๋กฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ฐ๋ผ์ ๊ตฌ์ฑ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ๋ฐ์ ์ข ์์ฑ์ผ๋ก
identity-obj-proxy
ํจํค์ง๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.์์ธํ ๋ด์ฉ์. jest ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.