Jest: ES6 ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ

์— ๋งŒ๋“  2016๋…„ 11์›” 11์ผ  ยท  93์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/jest

๊ธฐ๋Šฅ ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ  ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
๋ฒ„๊ทธ ์‹ ๊ณ 

ํ˜„์žฌ ํ–‰๋™์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
ํ˜„์žฌ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋‚ด ์ƒ์šฉ๊ตฌ์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ์— ๋ชจ๋‘ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ์•„์ง ์ถ”์ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Jest๊ฐ€ ๋‚ด package.json์˜ babel ๊ตฌ์„ฑ์„ ๋ˆ„๋ฝํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๊ฐ€ '์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ'๋กœ ์‹คํŒจํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ผ์ฃผ์ผ ์ „๊นŒ์ง€๋งŒ ํ•ด๋„ ์ด ๊ตฌ์„ฑ์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์ž‘๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํšŒ๊ท€๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ณด๊ณ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

.babelrc ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ์— ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋™์ผํ•œ Unexpected Token Import๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋‘ ES6 ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” 12๊ฐœ์˜ ํ†ต๊ณผ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์ด์ƒํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. .babelrc๊ฐ€ ์—†์œผ๋ฉด 14๊ฐœ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋™์ž‘์ด ๋ฒ„๊ทธ์ธ ๊ฒฝ์šฐ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ npm install ๋ฐ npm test ํ•  ์ˆ˜ ์žˆ๋Š” GitHub์˜ ์ตœ์†Œ ์ €์žฅ์†Œ๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๊ฒƒ์€ ๋‚ด์—์„œ ์žฌํ˜„ ํ•  ์ˆ˜์žˆ๋Š” ๋ณด์ผ๋Ÿฌ ์„ค์น˜ํ•˜์—ฌ npm run setup ์‹คํ–‰ npm run test .

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์ด์ „์— ์ž‘๋™ํ–ˆ๋˜ Jest ๊ตฌ์„ฑ์ด ๊ณ„์† ์ž‘๋™ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ „์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ๋” ์ด์ƒ ์ด์ „์ฒ˜๋Ÿผ babel-jest์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

--debug Jest๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ณ  ์ธ์‡„ํ•  ์ „์ฒด ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

jest version = 16.0.2
test framework = jasmine2
config = {
  "scriptPreprocessor": "/Users/myMac/Developer/works-in-progress/open-source-maintaining/scalable-react-boilerplate/config/testing/preprocessor.js",
  "moduleFileExtensions": [
    "js",
    "jsx",
    "json"
  ],
  "moduleDirectories": [
    "node_modules",
    "bower_components",
    "shared"
  ],
  "rootDir": "/Users/myMac/Developer/works-in-progress/open-source-maintaining/scalable-react-boilerplate",
  "name": "-Users-myMac-Developer-works-in-progress-open-source-maintaining-scalable-react-boilerplate",
  "setupFiles": [],
  "testRunner": "/Users/myMac/Developer/works-in-progress/open-source-maintaining/scalable-react-boilerplate/node_modules/jest-jasmine2/build/index.js",
  "automock": false,
  "bail": false,
  "browser": false,
  "cacheDirectory": "/var/folders/nq/7kdqy15d3m399326f7wtb_6w0000gn/T/jest",
  "clearMocks": false,
  "coveragePathIgnorePatterns": [
    "/node_modules/"
  ],
  "coverageReporters": [
    "json",
    "text",
    "lcov",
    "clover"
  ],
  "globals": {},
  "haste": {
    "providesModuleNodeModules": []
  },
  "mocksPattern": "__mocks__",
  "moduleNameMapper": {},
  "modulePathIgnorePatterns": [],
  "noStackTrace": false,
  "notify": false,
  "preset": null,
  "preprocessorIgnorePatterns": [
    "/node_modules/"
  ],
  "resetModules": false,
  "testEnvironment": "jest-environment-jsdom",
  "testPathDirs": [
    "/Users/myMac/Developer/works-in-progress/open-source-maintaining/scalable-react-boilerplate"
  ],
  "testPathIgnorePatterns": [
    "/node_modules/"
  ],
  "testRegex": "(/__tests__/.*|\\.(test|spec))\\.jsx?$",
  "testURL": "about:blank",
  "timers": "real",
  "useStderr": false,
  "verbose": null,
  "watch": false,
  "cache": true,
  "watchman": true,
  "testcheckOptions": {
    "times": 100,
    "maxSize": 200
  }
}

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

Node์—์„œ ES ๋ชจ๋“ˆ์ด ์ง€์›๋˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ฐฐ์†กํ•  ๋•Œ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ(์›นํŒฉ, ๋กค์—…)์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์„ ์˜๋„์ ์œผ๋กœ ์ค‘๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

babelrc์˜ "ํ…Œ์ŠคํŠธ" ํ™˜๊ฒฝ์„ ์œ„ํ•ด ES ๋ชจ๋“ˆ์—์„œ CommonJS๋กœ ์ปดํŒŒ์ผ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( https://babeljs.io/docs/usage/babelrc/#env -option ๋ฐ https://babeljs.io/docs/ ์ฐธ์กฐ). ํ”Œ๋Ÿฌ๊ทธ์ธ/transform-es2015-modules-commonjs/

{
  "env": {
    "production": {
      "plugins": ["transform-es2015-modules-commonjs"]
    }
  }
}

๋ชจ๋“  93 ๋Œ“๊ธ€

React-Native ๋ฐ Jest์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ:
๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์ดˆ๊ธฐํ™” AwesomeProject
CD ์–ด์ธํ”„๋กœ์ ํŠธ

๊ทธ๋Ÿฐ ๋‹ค์Œ npm install native-base --save์™€ ๊ฐ™์€ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
๊ธฐ๋ณธ ๊ธฐ๋ฐ˜์—์„œ index.ios.js ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ

npm ํ…Œ์ŠคํŠธ์—์„œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
../test/node_modules/native-base/index.js:4
'./Components/vendor/react-native-drawer'์—์„œ ์„œ๋ž ๊ฐ€์ ธ์˜ค๊ธฐ;
^^^^^^
SyntaxError: ์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. @cpojer๊ฐ€ ์ œ๊ณตํ•œ ๋งํฌ๊ฐ€ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ๐Ÿ˜•

์•ˆ๋…•ํ•˜์„ธ์š”! 'transformIgnorePatterns'๋Š” ....mmmm...ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค - ๋ฌด์‹œ)
๊ทธ๋Ÿฌ๋‚˜ node_modules์˜ ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์†Œํ’ˆ์ด ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค :)

{
  "jest": {
    "verbose": true,
    "moduleDirectories": ["node_modules", "src"]
  },
}

UPD1
ํ˜„์žฌ ๋‚ด Jest ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"jest": {
    "verbose": true,
    "transform": {
      "^.+\\.js$": "babel-jest",
      "^.+\\.(css|scss|less)$": "jest-css-modules"
    },
    "globals": {
      "NODE_ENV": "test"
    },
    "moduleFileExtensions": [
      "js",
      "jsx"
    ],
    "moduleDirectories": [
      "node_modules",
      "src/frontend",
      "src/shared"
    ]
  },

... ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค :)

์•ˆ๋ถ€ ์ธ์‚ฌ, Pavel Tretyakov

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ๋‚˜๋Š” ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์ง€๋งŒ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ํ•ญ์ƒ jest --no-cache๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€์ง€ ์•Š๊ณ  ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋†๋‹ด์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ณ€ํ™˜์ด ๋‚ด create-react-app ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ES6 ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ํŒŒ์ผ์—์„œ ํ•ญ์ƒ "์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ"๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ œ์•ˆ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. no-cache๋Š” ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋ณ€ํ™˜์—์„œ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ๋ฌด์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!).

๋‚˜๋Š” ํฌ๊ธฐํ•œ๋‹ค. ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ €๋„ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

Node์—์„œ ES ๋ชจ๋“ˆ์ด ์ง€์›๋˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ฐฐ์†กํ•  ๋•Œ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ(์›นํŒฉ, ๋กค์—…)์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์„ ์˜๋„์ ์œผ๋กœ ์ค‘๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

babelrc์˜ "ํ…Œ์ŠคํŠธ" ํ™˜๊ฒฝ์„ ์œ„ํ•ด ES ๋ชจ๋“ˆ์—์„œ CommonJS๋กœ ์ปดํŒŒ์ผ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( https://babeljs.io/docs/usage/babelrc/#env -option ๋ฐ https://babeljs.io/docs/ ์ฐธ์กฐ). ํ”Œ๋Ÿฌ๊ทธ์ธ/transform-es2015-modules-commonjs/

{
  "env": {
    "production": {
      "plugins": ["transform-es2015-modules-commonjs"]
    }
  }
}

๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, cpojer. ์–ด์ œ jest๊ฐ€ ์ „์—ญ์ ์œผ๋กœ ์ž‘๋™ํ–ˆ์ง€๋งŒ ๋…ธ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด์ œ ๋…ธ๋“œ ํ™˜๊ฒฝ ์„ค์ •์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ธฐ๋ณธ ๋…ธ๋“œ ํ™˜๊ฒฝ์œผ๋กœ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์œผ๋ฏ€๋กœ ๋‚ด ๋ฌธ์ œ๋Š” node-env ์„ค์ •์— ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์ด๊ฒƒ์€ ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. @cpojer ์˜ ์ˆ˜์ •์€ ๋งค๋ ฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

@cpojer ์˜ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ €์—๊ฒŒ

๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค, ๋˜ํ•œ ์ €๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ•œ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์—์„œ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

npm test ๋˜๋Š” jest ํ•˜๋ฉด 'SyntaxError: Unexpected token import' ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

.babelrc

{
"presets": ["react-native"]
}

.ํŒจํ‚ค์ง€.json

{
  "name": "BeeAppy",
  "version": "0.1.0",
  "private": true,
  "devDependencies": {
    "babel-jest": "^20.0.3",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "babel-preset-react-native": "^2.0.0",
    "enzyme": "^2.8.2",
    "eslint": "^4.0.0",
    "eslint-plugin-react": "^7.1.0",
    "jest": "^20.0.4",
    "react-addons-test-utils": "^15.6.0",
    "react-dom": "^15.6.1",
    "react-test-renderer": "^16.0.0-alpha.6"
  },
  "scripts": {
    "start": "react-native start",
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "test": "node node_modules/jest/bin/jest.js --watch"
  },
  "jest": {
    "preset": "react-native"
  },
  "dependencies": {
    "react": "16.0.0-alpha.6",
    "react-native": "^0.44.0",
    "react-navigation": "^1.0.0-beta.11"
  }
}

@cpojer ๊ฐ€ ์ œ์•ˆํ•œ env ์Šค๋‹ˆํŽซ์ด
์ •๋ง ๋ป”ํ–ˆ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!
์–ด๋–ค ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@JessicaBarclay .babelrc ๊ตฌ์„ฑ์— ๋“ค์–ด๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด:

"env": {
          "development": {
                 "plugins": ["transform-es2015-modules-commonjs"]
          }
}

์•„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @rlage ! ์ •๋ ฌ:)

FWIW, ์‹ค์ œ๋กœ @cpojer ๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์˜ฌ๋ฐ”๋ฅธ presets ๋ฐ plugins .babelrc ์„ค์ •ํ–ˆ์ง€๋งŒ NODE_ENV=test ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. package.json .

์ด์ „์—๋Š” "์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ"๊ฐ€ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

"scripts": {
  ...
  "test": "jest",
}

ํŒŒ์ผ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„:

"scripts": {
  ...
  "test": "NODE_ENV=test jest",
}

@jlyman

Jest ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Jest๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋„๋ก NODE_ENV๋ฅผ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : Babel์˜ env ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋ณต์žกํ•œ Babel ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Jest๊ฐ€ ์ž๋™์œผ๋กœ NODE_ENV๋ฅผ ํ…Œ์ŠคํŠธ๋กœ ์ •์˜ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. NODE_ENV๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ Babel๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐœ ์„น์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด .babelrc๋Š” ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

{"env": {
    "development": {
        "plugins": ["transform-es2015-modules-commonjs"]
    },
    "test": {
        "plugins": ["transform-es2015-modules-commonjs"]
    }
}}

์ฐธ๊ณ : ์ด์ƒํ•ด ๋ณด์ด์ง€๋งŒ ๊ฐœ๋ฐœ ํ‚ค์™€ ํ…Œ์ŠคํŠธ ํ‚ค๊ฐ€ ๋ชจ๋‘ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋‚œ ๊ทธ๋ƒฅ ์ „ํ™” :

node_modules/.bin/jest

๋˜๋Š” package.json์„ ์‚ฌ์šฉํ•˜์—ฌ:

{"scripts": {"test": "jest"}}

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด NODE_ENV๋ฅผ ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@laszbalo ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋‘ ๋ฒˆ์งธ env ์˜ ์กด์žฌ๋Š” ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ช…์‹œ์ ์ธ NODE_ENV ์ ‘๋‘์‚ฌ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์„œ์˜ ๊ทธ ๋ถ€๋ถ„๋„ ์ฝ์—ˆ์ง€๋งŒ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์†”๋ฃจ์…˜์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

@jlyman ๋ฌธ์„œ์˜ ์†”๋ฃจ์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@doudounannan ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์กŒ๋˜ ํ•ด๊ฒฐ์ฑ…์€ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. @laszbalo๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ Using Babel ์—์„œ ๋ฌธ์„œ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ์–ด๊ธ‹๋‚˜์ง€ ๋งŒ NODE_ENV test ์˜ ์ง์ ‘ ์ฃผ์ž…์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด์ƒํ•˜๊ฒŒ๋„ "transformIgnorePatterns": [ ] ํ•˜๋ฉด babel์ด ํ…Œ์ŠคํŠธํ•œ ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜์ง€๋งŒ transformIgnorePatterns ์˜ต์…˜์„ ์ œ์™ธํ•˜๋ฉด babel์€ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค... ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ๋งŒ ๊ฐ„๋‹จํ•œ .babelrc๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์—๋Š” webpack์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ jest์˜ ํ…Œ์ŠคํŠธ์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ):

{
  "env": {
    "test": {
      "plugins": ["transform-es2015-modules-commonjs"]
    }
  }
}

https://github.com/facebook/jest/issues/2550#issuecomment -290812720์—์„œ ์•„์ด๋””์–ด๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. #770 ๋˜๋Š” ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ๋„์›€์ด ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค...

๋‚ด๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋“ ์ง€ ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๊ฐ™์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

    /.../node_modules/@expo/react-native-action-sheet/ActionSheet.ios.js:3
    import React from 'react';
    ^^^^^^

    SyntaxError: Unexpected token import

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/ScriptTransformer.js:289:17)
      at Object.<anonymous> (node_modules/@expo/react-native-action-sheet/index.js:1:107)
      at Object.<anonymous> (node_modules/react-native-gifted-chat/src/GiftedChat.js:10:29)
{
  "env": {
    "production": {
      "plugins": ["transform-es2015-modules-commonjs"]
    },
    "development": {
      "plugins": ["transform-es2015-modules-commonjs"]
    },
    "test": {
      "plugins": ["transform-es2015-modules-commonjs"]
    }
  },
  "presets": [
    "react-native"
  ],
  "plugins": [
    ["module-resolver", {
            "cwd": "babelrc",
        }]
  ]
}
"jest": {
    "preset": "react-native",
    "setupFiles": [
        "./__tests__/setup.js"
    ],
    "testRegex": "/__tests__/.*\\.spec\\.js$"
}

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋†๋‹ด์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

"jest": {
     "preset": "react-native",
     "transformIgnorePatterns": [
          "node_modules/(?!react-native|react-navigation)/"
      ]
  }

์ด์ œ Jest๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ReferenceError: 0์—์„œ "/Users/caalcaz/Documents/Projects/Enterprise-app/node_modules/enzyme/.babelrc"์— ์ง€์ •๋œ ์•Œ ์ˆ˜ ์—†๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ "transform-replace-object-assign", "/Users/caalcaz/๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. Documents/Projects/Enterprise-app/node_modules/enzyme"

@calcazar node_modules/enzyme/.babelrc์— ๋ฌด์—‡์ด ์žˆ์Šต๋‹ˆ๊นŒ?

babel-jest _and_ ts-jest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. package.json์—์„œ:

"jest": {
    "modulePaths": [
        "<rootDir>/src",
        "<rootDir>/node_modules"
    ],
    "globals": {
        "NODE_ENV": "test"
    },
    "verbose": true,
    "moduleFileExtensions": [
        "ts",
        "tsx",
        "js",
        "jsx",
        "json"
    ],
    "transform": {
        "^.+\\.jsx?$": "babel-jest",
        "^.+\\.tsx?$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
    },
    "transformIgnorePatterns": ["/node_modules/(?!lodash-es)"], // <-- this allows babel to load only the node modules I need (which is lodash-es) and ignore the rest
    "testRegex": "test/.*\\.spec\\.ts$",
    "setupFiles": [
        "<rootDir>/test/jest-pretest.ts"
    ],
    "testEnvironment": "node",
    "moduleNameMapper": {
        "aurelia-(.*)": "<rootDir>/node_modules/$1"
    },
    // some coverage and results processing options
},

๊ทธ๋Ÿฐ ๋‹ค์Œ .babelrc์—์„œ(ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉ)

{
    "env": {
        "test": {
        "plugins": ["transform-es2015-modules-commonjs"]
        }
    }
}

๊ทธ๊ฒƒ์ด ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค! (์ด๊ฒƒ์€ aurelia ์•ฑ์šฉ์ด๋ฏ€๋กœ YMMV)

@thinkOfaNumber

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ €๋Š” Enzyme V3.0์„ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

{
  "presets": ["airbnb"],
  "plugins": [
    ["transform-replace-object-assign", "object.assign"],
  ],
}

@thinkOfaNumber ์ œ์•ˆ์„ ๊ฒŒ์‹œ

"jest": {
    "modulePaths": [
        "<rootDir>/src",
        "<rootDir>/node_modules"
    ],
    "transformIgnorePatterns": ["/node_modules/(?!lodash-es)"], // <-- this allows babel to load only the node modules I need (which is lodash-es) and ignore the rest

๊ผญ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ •๋ง ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค!

@rochapablo ๊ฐ™์€ ๊ณณ. ํ–‰์šด์ด ์žˆ๋‚˜์š”?

Noop, ์ง€๊ธˆ์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํŠน์ • ํŒŒ์ผ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜ํ–‰์›. ๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŒ”๋กœ์šฐ๋„

@rochapablo ์ด ๋ฌธ์ œ๋ฅผ
๋‚˜๋Š” ๋˜ํ•œ ๋‹น์‹ ์ด ์–ธ๊ธ‰ ํ•œ ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์ž์‹์œผ๋กœ GiftedChat ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ...

@todorone , ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

"transformIgnorePatterns": [
      "node_modules/(?!react-native-gifted-chat)/"
]

@rochapablo ํžŒํŠธ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๋„์›€์ด๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. transformIgnorePatterns ์ •๊ทœ์‹์œผ๋กœ ๋” ํ”Œ๋ ˆ์ดํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋„์›€์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

"transform": { "^.+\\.js$": "babel-jest", "^.+\\.jsx?$": "babel-jest" },
๋†๋‹ด์— ์œ„์˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค

@rochapablo jest-expo ํ”„๋ฆฌ์…‹ ํ•ด๋ณด ์…จ๋‚˜์š”? ํ–‰์šด์ด ์žˆ๋‚˜์š”? transformIgnorePatterns ๋˜ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นŒ์–ด๋จน์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
image

@testacode ๋™์  import ํ•„์š”ํ•œ babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๊นŒ? https://facebook.github.io/jest/docs/en/webpack.html#using -with-webpack-2 ํ•˜๋‹จ ์ฐธ์กฐ

@SimenB ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋†“์นœ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

ํฅ๋ฏธ ๋กญ๊ตฐ. ์ผ๋ถ€ ์ตœ๊ทผ ์—…๋ฐ์ดํŠธ๋Š” babel-jest์˜ ์ž๋™ ์ถ”๊ฐ€๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹คํ–‰ :

npm install babel-jest --save-dev

๊ตฌ์„ฑ์— NOTHING ELSE๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ...

babel-jest๋ฅผ ์„ค์น˜ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
npm i babel-jest

๋˜ํ•œ ๋‹ค์Œ ๋‚ด์šฉ์œผ๋กœ .babelrc ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

{
    "presets": ["env", "react"]
}

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

.babelrc :

{
    "presets": ["env", "stage-3"],
    "plugins": ["transform-class-properties"]
}

package.json :

"scripts": {
    "test": "jest --forceExit"
},
"devDependencies": {
    "babel-core": "^6.11.4",
    "babel-jest": "^21.2.0",
    "babel-plugin-transform-class-properties": "^6.24.1",
    "babel-preset-env": "^1.6.1",
    "babel-preset-stage-3": "^6.24.1",
    "jest": "^21.2.0"
}

@hqro ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘

์ €์—๊ฒŒ๋Š” .babelrc ํŒŒ์ผ์— ๋‹ค์Œ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

{
  "presets": ["react", ["env", { "modules": false }]],
  "plugins": [ ... ]
}

๊ทธ๋ฆฌ๊ณ  "ํ…Œ์ŠคํŠธ" ํ™˜๊ฒฝ์ด ๋Œ€์‹  ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

{
  "presets": ["react", ["env", { "modules": false }]],
  "plugins": [ ... ],
  "env": {
    "test": {
      "presets": ["react", "env"],
    }
  }
}

@nemoDreamer ํ•˜๋‚˜์˜ ๊ตฌ์„ฑ์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์‚ฌ์ „ ์„ค์ •์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค

{
  "presets": ["react", ["env", { "modules": false }]],
  "plugins": [ ... ],
  "env": {
    "test": {
      "plugins": ["transform-es2015-modules-commonjs"],
    }
  }
}

๋ฌด์—‡์„ ์‹œ๋„ํ•˜๋“  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

> cross-env NODE_ENV=test jest --no-cache

 FAIL  src\views\Pay\__tests__\Pay.test.js
  โ— Test suite failed to run

    C:\Users\***\Documents\Project\***\node_modules\ne-rc\lib\index.js:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import _Alert from './Alert';
                                                                                             ^^^^^^

    SyntaxError: Unexpected token import

      11 |  * <strong i="6">@param</strong> {Array<Object>} [data] ๆฏไธ€็งๅˆ†ๆœŸ็š„่ฏฆ็ป†ไฟกๆฏ data=[{},{}...]
      12 |  * <strong i="7">@param</strong> {Number} [defaultSelected] ้ป˜่ฎค้€‰ไธญ็š„ไธ‹ๆ ‡
    > 13 |  * <strong i="8">@param</strong> {Funtion} [onClick] ็‚นๅ‡ป่งฆๅ‘ไบ‹ไปถ
      14 |  * <strong i="9">@param</strong> {Number} [columnNum] ไธ€่กŒๆœ‰ๅคšๅฐ‘ๅˆ—
      15 |  *
      16 |  * <strong i="10">@example</strong>

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:316:17)
      at Object.<anonymous> (src/components/Installment/Installment.jsx:13:13)
      at Object.<anonymous> (src/components/Installment/index.js:8:20)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        3.693s

์—ฌ๊ธฐ ๋‚ด ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

* .babelrc *

{
  "presets": [
    [
      "env",
      {
        "modules": false
      }
    ],
    // webpack understands the native import syntax, and uses it for tree shaking

    "es2015",
    "stage-2",
    // Specifies what level of language features to doPay.

    // Stage 2 is "draft", 4 is finished, 0 is strawman.

    // See https://tc39.github.io/process-document/

    "react"
    // Transpile React components to JavaScript
  ],
  "env": {
    "test": {
      "presets": ["env", "react", "stage-2"],
      "plugins": [
        "transform-es2015-modules-commonjs"
      ]
    }
  }
}

ํŒจํ‚ค์ง€.json

{
  "main": "index.js",
  "scripts": {
    "dev": "cross-env NODE_ENV=development node ./server/server.js",
    "api": "cross-env NODE_ENV=api node ./server/server.js",
    "clean": "rm -rf dist",
    "dist": "npm run clean && cross-env NODE_ENV=production webpack --config ./webpack/index.js --progress --colors",
    "online": "cross-env NODE_ENV=development node ./server/online.js",
    "lint": "node ./node_modules/eslint/bin/eslint.js ./src --fix",
    "test": "cross-env NODE_ENV=test jest --no-cache",
    "test:watch": "npm test --watch",
    "stats": "npm run clean && cross-env NODE_ENV=production webpack --config ./webpack/index.js --profile --json > stats.json",
    "gatest": "node ./service/gatest.js"
  },
  "pre-commit": [
    "lint"
  ],
  "jest": {
    "verbose": true,
    "modulePaths": [
      "<rootDir>/src",
      "<rootDir>/node_modules"
    ],
    "setupFiles": [
      "./test/setup.js"
    ],
    "moduleFileExtensions": [
      "js",
      "jsx",
      "json",
      "md"
    ],
    "moduleDirectories": [
      "node_modules"
    ],
    "testMatch": [
      "<rootDir>/src/**/__tests__/**/*.{js,jsx,mjs}",
      "<rootDir>/src/**/?(*.)(spec|test).{js,jsx,mjs}"
    ],
    "transform": {
      "^.+\\.(js|jsx|mjs)$": "<rootDir>/node_modules/babel-jest",
      "^.+\\.css$": "<rootDir>/config/jest/cssTransform.js",
      "^(?!.*\\.(js|jsx|mjs|css|json)$)": "<rootDir>/config/jest/fileTransform.js"
    },
    "testEnvironment": "jsdom"
  },
  "devDependencies": {
    "asset-inject-html-webpack-plugin": "^0.9.1",
    "autoprefixer": "^7.1.3",
    "babel": "^6.23.0",
    "babel-core": "^6.26.0",
    "babel-eslint": "^8.2.1",
    "babel-jest": "^22.4.1",
    "babel-loader": "^7.1.2",
    "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
    "babel-preset-env": "^1.6.1",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-jest": "^22.4.1",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-2": "^6.24.1",
    "babel-register": "^6.26.0",
    "better-npm-run": "0.1.0",
    "body-parser": "^1.17.2",
    "chalk": "^2.1.0",
    "cross-env": "^5.0.5",
    "css-loader": "^0.28.5",
    "deepmerge": "^2.0.1",
    "enzyme": "^3.3.0",
    "eslint": "^4.5.0",
    "eslint-config-standard": "^11.0.0-beta.0",
    "eslint-config-standard-jsx": "^4.0.2",
    "eslint-plugin-import": "^2.2.0",
    "eslint-plugin-node": "^5.1.1",
    "eslint-plugin-promise": "^3.5.0",
    "eslint-plugin-react": "^7.3.0",
    "eslint-plugin-standard": "^3.0.1",
    "exports-loader": "^0.6.4",
    "express": "^4.15.4",
    "extract-text-webpack-plugin": "^3.0.0",
    "file-loader": "^1.1.6",
    "git-repo-info": "^1.4.1",
    "glob": "^7.1.2",
    "happypack": "^4.0.1",
    "html-loader": "^0.5.1",
    "html-webpack-plugin": "^2.30.1",
    "idb": "^2.0.4",
    "imports-loader": "^0.7.0",
    "jest": "^22.4.2",
    "lodash.range": "^3.2.0",
    "mocha": "^5.0.0",
    "node-sass": "^4.5.3",
    "node-xlsx": "^0.11.2",
    "postcss-loader": "^2.0.6",
    "pre-commit": "^1.2.2",
    "react-hot-loader": "^3.0.0-beta.6",
    "react-test-renderer": "^16.2.0",
    "redux-logger": "^3.0.6",
    "regenerator-runtime": "^0.11.1",
    "request": "^2.74.0",
    "require-reload": "^0.2.2",
    "rimraf": "^2.6.0",
    "sass-loader": "^6.0.6",
    "script-loader": "^0.7.0",
    "sinon": "^4.2.0",
    "style-loader": "^0.19.1",
    "uglify-js": "^3.0.28",
    "url-loader": "^0.6.2",
    "webpack": "^3.5.5",
    "webpack-bundle-analyzer": "^2.9.0",
    "webpack-dev-middleware": "^2.0.4",
    "webpack-dev-server": "^2.7.1",
    "webpack-hot-middleware": "^2.18.2",
    "webpack-merge": "^4.1.0",
    "worker-loader": "^1.1.0"
  }
}

.babelrc ์—์„œ ์‚ฌ์ „ ์„ค์ •์„ ์„ค์ •ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด "env" ๊ฐ€ ๋Œ€๊ด„ํ˜ธ ["env"] ์‚ฌ์ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

  "env": {
    "test": {
      "presets": [["env"], "stage-2"],
      "plugins": ["transform-es2015-modules-commonjs", "dynamic-import-node"]
    }
  }

ํŠนํžˆ ๊ตฌ์„ฑ์— "modules: false" ์žˆ๋Š” ๊ฒฝ์šฐ.

๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ jest๋Š” node_modules ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . cf https://facebook.github.io/jest/docs/en/configuration.html#transformignorepatterns -array-string

์ด๊ฒƒ์ด import ... ๊ฐ€ node_modules ํŒŒ์ผ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

transformIgnorePatterns: []

๋‹น์‹ ์˜ ๋†๋‹ด ๊ตฌ์„ฑ์—.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

@florentchauveau ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

@todorone @rochapablo ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์œผ์…จ์Šต๋‹ˆ๊นŒ? ๋‚˜๋„ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ๋‹ค-

    import * as React from 'react';
    ^^^^^^

    SyntaxError: Unexpected token import

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:316:17)
      at Object.<anonymous> (node_modules/@expo/react-native-action-sheet/index.js:1:107)

๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ ํ…Œ์ŠคํŠธ์—์„œ๋งŒ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
GiftedChat - https://github.com/FaridSafi/react-native-gifted-chat.
@expo/react-native-action-sheet ๊ฐ€ ES6 ๋ชจ๋“ˆ๋กœ ๋ฐฐ์†ก๋˜๊ณ  ์žˆ๊ณ  GiftedChat ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ๊นŒ์š”? ๊ทธ๋Ÿฌ๋‚˜ jest / ts-jest (ํ™•์‹คํ•˜์ง€ ์•Š์Œ) ์‚ฌ์ „ ์„ค์ •์ด ์ถ”๊ฐ€๋˜๋ฉด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋‚ด Jest ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค -

    "jest": {
        "preset": "react-native",
        "moduleFileExtensions": [
            "ts",
            "tsx",
            "js"
        ],
        "transform": {
            "^.+\\.(js)$": "<rootDir>/node_modules/babel-jest",
            "\\.(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
        },
        "transformIgnorePatterns": [
            "node_modules/(?!rn-placeholder|react-native|react-navigation|native-base|react-native-datepicker|native-base-shoutem-theme|@shoutem/animation|@shoutem/ui|tcomb-form-native)"
        ],
        "setupTestFrameworkScriptFile": "<rootDir>/src/__mocks__/Adapter.js",
        "testRegex": "(\\.(test|spec))\\.(ts|tsx|js)$",
        "testPathIgnorePatterns": [
            "\\.snap$",
            "<rootDir>/node_modules/",
            "<rootDir>/lib/"
        ],
        "moduleNameMapper": {
            "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/src/__mocks__/fileMock.js"
        },
        "cacheDirectory": ".jest/cache"
    },

๊ทธ๋ฆฌ๊ณ  .babelrc -

{
    "presets": ["react-native"]
}

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ๋ˆ„๊ตฌ๋„ ๋‚ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ํ•„์š”ํ•œ.

@omkarjoshi-cc ๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋˜ ์‹œ๊ฐ„์— ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ์œ ์ผํ•œ ๊ฒƒ์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"transformIgnorePatterns": [
      "node_modules/(?!react-native-gifted-chat)/"
]

@rochapablo ๋„ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋†“์น  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฑฐ ์ •๋ง ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜“

๋‚˜๋Š” babel 7์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‚˜๋Š” ์—ฌ์ „ํžˆ "transformIgnorePatterns"์— ์šด์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค - ๋งŽ์€ ๋‹ค๋ฅธ ์ •๊ทœ ํ‘œํ˜„์‹์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค :/

๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ œ๋Š” ํ•˜๋‚˜์˜ ์ข…์†์„ฑ์— ๊ธฐ๋ณธ es6 ํด๋ž˜์Šค๊ฐ€ ์žˆ๊ณ  ๋‚ด ์†Œ์Šค์— ์ด๋ฅผ ํ™•์žฅํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Babel์— ์˜ํ•ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ "es5 ํด๋ž˜์Šค"๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋†๋‹ด์œผ๋กœ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ๋“  "babel/preset-env"๊ฐ€ ์ฝ”๋“œ๊ฐ€ jest(๋Œ€์ƒ ๋…ธ๋“œ)๋กœ ๋ณ€ํ™˜๋˜๋Š” ๋ฐฉ์‹์„ ๋ฐฉํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ธŒ๋ผ์šฐ์ € ๋Œ€์ƒ์„ ๋”ฐ๋ฅด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

.babelrc์—์„œ 'present-env'๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋†๋‹ด์„ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ es5๋กœ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ babel-jest๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  webpack(babel-loader๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ณ€ํ™˜ํ•  ํŒŒ์ผ์ด ์ €์—๊ฒŒ ์ ํ•ฉํ•จ)์„ ์‹คํ–‰ํ•œ ๋‹ค์Œ jest๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. -> webpack -w ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒจ๊ฐ€

"transformIgnorePatterns": [
      "node_modules/(?!react-native-gifted-chat|@expo/react-native-action-sheet)"
]

๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ๋‹ค. @rochapablo ๋•๋ถ„์— ๐Ÿ™Œ

์ด ๋ฌธ์ œ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ค‘์ธ ๋‚ด ์ถœ๋ ฅ ํด๋”๊ฐ€ import ๋“ฑ์˜ ES6 ๊ตฌ๋ฌธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ๋‚ด ์ถœ๋ ฅ ํŒŒ์ผ/ํŒŒ์ผ์— commonjs๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(react-native์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ).

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ์ด ํŽ˜์ด์ง€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
https://babeljs.io/docs/plugins/transform-es2015-modules-commonjs/

์–ด๋–ค ์ด์œ ๋กœ babel-jest ๋Œ€์‹  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค ( transformIgnorePatterns ๋ถ„๋ช…ํžˆ ์กด์ค‘)

"transform": {
      "^.+\\.(js|jsx|ts|tsx)$": "ts-jest-babel-7"
    }

btw ์ด ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์—์„œ ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์–ด๋ ค์›€์„ ๊ฒช๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค

์ œ ๊ฒฝ์šฐ์—๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ๋‚ด babel ๊ตฌ์„ฑ์—์„œ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜์—ฌ ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ์—†๋Š” ์ด์œ ๋กœ ๋‚ด .babelrc์— "ignore": ["**/*.test.js"] ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฌด์‹œ ์˜ต์…˜์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ:

"env": {
    "production": {
      "ignore": [
        "**/*.test.js"
      ]
    }
  }

๋˜๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด ํŠน๋ณ„ํ•œ ๋ฌด์‹œ ํŒจํ„ด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์ด ์‹œ๋„ํ•œ ํ›„ ๋‚ด ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. babe-jest์˜ ์˜ฌ๋ฐ”๋ฅธ ๋ฒ„์ „์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค *
  2. ์‚ฌ์ „ ์„ค์ •์ด ์žˆ๋Š” .babelrc ๊ตฌ์„ฑ์ด ์žˆ๋Š”์ง€ ํ™•์ธ(์ด์ „์— ์„ค์น˜๋จ)
  3. ์—ฌ์ „ํžˆ "์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ† ํฐ"์ด๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ™”์‚ดํ‘œ ๊ธฐ๋Šฅ์ด ์ธ์‹๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด babel ํ”Œ๋Ÿฌ๊ทธ์ธ์€ "transform-class-properties"๋„ babel ๊ตฌ์„ฑ์— ํฌํ•จํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

.babelrc

{
  "plugins": [
    "transform-es2015-modules-commonjs",
    "transform-class-properties"
  ]}

ํšจ์†Œ์šฉ(setupTests.js)

import { configure } from "enzyme";
import Adapter from "enzyme-adapter-react-15";
configure({ adapter: new Adapter() });

ํŒจํ‚ค์ง€.json

 "dependencies": {
    "babel-cli": "^6.26.0",
    "babel-plugin-transform-class-properties": "^6.24.1",
    "eslint": "^4.19.1",
    "react": "^15.4.2",
    "react-dom": "^15.4.2",
    "react-test-renderer": "^15.6.2",
     "babel-jest": "^22.4.3",
    "babel-preset-env": "^1.6.1",
    "babel-preset-react": "^6.24.1",
    "enzyme": "^3.3.0",
    "enzyme-adapter-react-15": "^1.0.5",
    "gh-pages": "^0.12.0",
    "jest": "^22.4.3",
    "react-addons-test-utils": "^15.4.2",
    "regenerator-runtime": "^0.11.1"
  },
"jest": {
    "globals": {
      "NODE_ENV": "test"
    },
    "verbose": true,
    "moduleDirectories": ["node_modules", "src"],
    "transform": {
      "^.+\\.jsx?$": "babel-jest"
    },
    "moduleFileExtensions": ["js", "jsx"],
    "setupTestFrameworkScriptFile": "<rootDir>/src/setupTests.js"
  }

yarn add --dev babel-jest babel-core regenerator-runtime ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” Windows ๋ฐ ์–ด๋ฆฌ์„์€ ๊ถŒํ•œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ์•„๋งˆ๋„ env ๋ณ€์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
git bash์—์„œ ์ƒ์Šน๋œ cmd.exe ํ•˜๊ณ  ๋‹ค์‹œ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š”์ด jest ๋กœ ์ •์˜ ๋œ script (์ด๋ฆ„ test:jest ๋กœ test ) ๋‚ด์—์„œ, package.json . ๊ทธ๋Ÿฌ๋‚˜ npm run test ์‹คํ–‰ํ•  ๋•Œ SyntaxError: Unexpected token import ์–ป์Šต๋‹ˆ๋‹ค.

root<strong i="14">@browserify</strong>:/var/machine-learning/src# npm run test

> [email protected] test /var/machine-learning/src
> jest --config /var/machine-learning/test/jest/jest.config.js

 FAIL  ../test/jest/__tests__/layout/analysis.test.jsx
  โ— Test suite failed to run

    /var/machine-learning/test/jest/__tests__/layout/analysis.test.jsx:6
    import React from 'react';
    ^^^^^^

    SyntaxError: Unexpected token import

      at ScriptTransformer._transformAndBuildScript (../../src/node_modules/jest-runtime/build/script_transformer.js:316:17)

 FAIL  ../test/jest/__tests__/layout/page.test.jsx
  โ— Test suite failed to run

    /var/machine-learning/test/jest/__tests__/layout/page.test.jsx:6
    import React from 'react';
    ^^^^^^

    SyntaxError: Unexpected token import

      at ScriptTransformer._transformAndBuildScript (../../src/node_modules/jest-runtime/build/script_transformer.js:316:17)

 FAIL  ../test/jest/__tests__/content/register.test.jsx
  โ— Test suite failed to run

    /var/machine-learning/test/jest/__tests__/content/register.test.jsx:6
    import React from 'react';
    ^^^^^^

    SyntaxError: Unexpected token import

      at ScriptTransformer._transformAndBuildScript (../../src/node_modules/jest-runtime/build/script_transformer.js:316:17)

 FAIL  ../test/jest/__tests__/content/login.test.jsx
  โ— Test suite failed to run

    /var/machine-learning/test/jest/__tests__/content/login.test.jsx:6
    import React from 'react';
    ^^^^^^

    SyntaxError: Unexpected token import

      at ScriptTransformer._transformAndBuildScript (../../src/node_modules/jest-runtime/build/script_transformer.js:316:17)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |        0 |        0 |        0 |        0 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 4 failed, 4 total
Tests:       0 total
Snapshots:   0 total
Time:        3.782s
Ran all test suites.
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] test: `jest --config /var/machine-learning/test/jest/jest.config.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] test script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-05-08T01_50_42_754Z-debug.log

๋˜ํ•œ ํ•ด๋‹น jest.config.js ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

module.exports = {
  'verbose': true,
  'collectCoverage': true,
  'coverageDirectory': '/var/machine-learning',
  'moduleDirectories': ['/var/machine-learning/src/node_modules'],
  'transformIgnorePatterns': [
    '/var/machine-learning/src/node_modules'
  ]
}

react-native ๋ฐ transformIgnorePatterns ๋Œ€ํ•ด ๋งŽ์€ ๊ฒƒ์„ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šด ์ข‹๊ฒŒ๋„ ๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์–ผ๋งˆ๋‚˜ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“  ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ •์˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ .babelrc , ๋˜๋Š” ์ถ”๊ฐ€ jest ๋‚ด์—์„œ ์ง€์‹œ์–ด๋ฅผ package.json . ์ด ๊ฒฝ์šฐ ๋‚ด ๋†๋‹ด script ์ด babel์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” package.json ํฌํ•จํ•˜๋Š” ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— .babelrc ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์šด์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

{
  "env": {
    "test": {
      "presets": ["env", "stage-2", "react"]
    }
  }
}

์ฐธ๊ณ : ์œ„์˜ ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ๋‚ด ์›๋ž˜ ๋ฌธ์ œ ๋ฅผ ์ถ”์ ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ.

๋งŽ์€ ์†์ž„์ˆ˜ ๋์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Jest๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ babel 6์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Babel 6์€ .babelrc.js ํŒŒ์ผ์„ ์ฐพ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .babelrc ํŒŒ์ผ์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. JSON ๋Œ€์‹  JS ๊ตฌ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ตฌ์„ฑ์„ ์ฝ์ง€ ์•Š์œผ๋ฏ€๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ unexpected token: import ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • babel-7-jest ๋Š” ์ด์ „ Babel 7 ์ฝ”์–ด ์—”์ง„์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ƒˆ๋กœ์šด ์ œ์•ˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ์ง€์›์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.
  • npm i -D [email protected] ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ์ˆ˜์ •ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด babel ๊ตฌ์„ฑ์— env.test ๋„ ์—†๊ณ  jest ๊ตฌ์„ฑ๋„ ์—†์Šต๋‹ˆ๋‹ค.

Jest๊ฐ€ babel-core (๋”ฐ๋ผ์„œ @babel/core ๋ฌด์‹œ)๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Babel 6์œผ๋กœ ํด๋ฐฑํ•˜๊ณ  ๊ตฌ์„ฑ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์‹  babel-core(๋ธŒ๋ฆฌ์ง€ ๋ฒ„์ „)๊ฐ€ ์„ค์น˜๋˜๋ฉด ์ถ”๊ฐ€ ๊ตฌ์„ฑ ์—†์ด ES6 ๋ชจ๋“ˆ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

kasvtv ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‚ด .babelrc.js ๋ฅผ .babelrc ํ•˜๊ณ  npm i -D [email protected] . ์ด์ œ ๋‚ด ํ…Œ์ŠคํŠธ๋Š” babel-jest ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

.js ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Babel์€ ๋ฒ„์ „ 7๋ถ€ํ„ฐ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํŒŒ์ผ๋งŒ ์ฝ๊ณ  Jest๊ฐ€ Babel ๋ฒ„์ „ 7์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด [email protected] ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ด€์‹ฌ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ๋†๋‹ด + ํšจ์†Œ ํ…Œ์ŠคํŠธ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ž์œ ๋กญ๊ฒŒ ์ฐ”๋Ÿฌ๋ณด์„ธ์š”. ๋˜ํ•œ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ๋•๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

antd ๋ฐ rc-calendar ๋“ฑ์œผ๋กœ ์ธํ•ด ์œ ์‚ฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ transformIgnorePatterns

transformIgnorePatterns: [ 'node_modules/?!(antd|rc-.+)/' ],

moduleDirectories ๋„์›€์ด ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

moduleDirectories: ['node_modules'],

์ตœ์‹  ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  babel 7๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ–ˆ๋Š”๋ฐ ์ด์ œ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด node_modules๋ฅผ transformIgnorePatterns ํ•ด๋„ ๋” ์ด์ƒ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ๋” ์ด์ƒ Babel์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ณ , babelrc์˜ test ๋ถ€๋ถ„์— ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์‹œ์ž‘ ๊ฐ€์ด๋“œ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@kasvtv @willb335 ๋‚˜๋Š” Babel 6์ด .babelrc.js๋ฅผ ์ธ์‹ํ•˜๋„๋ก ํ•˜๋Š” ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

ํŒจํ‚ค์ง€.json

  "babel": {
    "presets": [
      "./.babelrc.js"
    ]
  },

@material/base ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ package.json & .babelrc ํŒŒ์ผ์„ ์ œ๊ณตํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์œ„์˜ ํ”ผ๋“œ๋ฐฑ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ํ˜ผ๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค ...

๋‚˜๋ฅผ ์œ„ํ•œ ํ•ด๊ฒฐ์ฑ…์€ .babelrc ํŒŒ์ผ์— "env" ์‚ฌ์ „ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์–ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.
{
"์‚ฌ์ „ ์„ค์ •": ["env", "es2016", "stage-0", "๋ฐ˜์‘"]
}

์ด ๋งํฌ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
https://jestjs.io/docs/en/webpack.html

@negarineh ๋งํฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

@haywirez ๊ฐ€ ์ œ๊ณตํ•˜๋Š” transformIgnorePatterns ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด

SyntaxError: Unexpected token import

์˜ค๋ฅ˜

TypeError: Cannot read property 'DocumentDir' of undefined

์˜ค๋ฅ˜. ์ฆ‰, ํŒจํ‚ค์ง€(rn-fetch-blob)๊ฐ€ ์ด์ œ ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:

์‹ค์ œ๋กœ ๋‹จ์ง€ ์ถ”๊ฐ€ transformIgnorePatterns: [], ๋‚ด์— jest.config.js ํ˜•์‹ ์˜ค๋ฅ˜์— CHAGE์— ๊ตฌ๋ฌธ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@schhumannd ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ์ œ๊ฐ€ ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ €์Šต๋‹ˆ๋‹ค. ๋งํฌ๊ฐ€ ํ˜„์žฌ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋””๋ ‰์…˜ ์ค‘์ž…๋‹ˆ๋‹ค. ๋งํฌ์— ์ œ๊ณต๋œ ๊ตฌ์„ฑ์œผ๋กœ "jest.config.js"๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์˜ค๋ฅ˜๊ฐ€ ๋งํฌ์˜ ์˜ˆ์ œ์™€ ๊ฐ™์€ ๋ชจ์˜ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ด ๊ตฌ์„ฑ์œผ๋กœ "identity-obj-proxy"๋ฅผ ์„ค์น˜ํ•˜์—ฌ .css ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ๊ฒฝ์šฐ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

npm install --save-dev identity-obj-proxy

jest.config.js(CSS ๋ชจ๋“ˆ์šฉ):

{ "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)$": "identity-obj-proxy" } } }

๋˜ํ•œ ์ด๊ฒƒ์€ ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ๋‚ด .babelrc ํŒŒ์ผ์ž…๋‹ˆ๋‹ค( test.config.js๋„ ๋ฃจํŠธ์— ์žˆ์–ด์•ผ ํ•จ).

๋จผ์ € babel์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด "babel-jest" ๋ฐ "regenerator-runtime"์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.

npm --dev babel-jest babel-core regenerator-runtime

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ๊ตฌ์„ฑ์„ .babelrc ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

{ "presets": ["env", "react"], "plugins": ["transform-class-properties"], "env": { "production": { "plugins": ["transform-es2015-modules-commonjs"] }, "test": { "presets": ["env", "react"], "plugins": ["transform-export-extensions"], "only": [ "./**/*.js", "node_modules/jest-runtime" ] } } }

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
https://jestjs.io/docs/en/webpack.html

์ œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ .babelrc ์ถ”๊ฐ€ํ•œ ํ›„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

{
  "presets": ["env", "react"],
  "env": {
    "test": {
      "plugins": ["transform-class-properties"]
    }
  }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ NODE_ENV=test jest ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋งŒ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๋ฌธ์ œ๋Š” ๋†๋‹ด์ด ๋‚ด JS ํŒŒ์ผ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  require ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์–˜๋“ค ์•„. babelrc ํŒŒ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. babel.config.js๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. babel.config.js๋กœ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•ฉ๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”

babel ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์œ„์˜ ํ† ๋ก ๊ณผ ๋‹ค๋ฅธ ๊ฒ€์ƒ‰์˜ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์˜ต์…˜(์˜ˆ: esm ์˜ต์…˜)์—์„œ ๋งŽ์€ ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. import ํ‚ค์›Œ๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ jest์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. es6 ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ๋ชจ๋“ˆ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์€ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๊ฒƒ์ด ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค : ts-jest

์ด์ œ ๋‚˜๋Š” ๋‚ด ์ฝ”๋“œ์—์„œ ์–ด๋–ค typescript๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ts-jest ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค(typescript๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  ๊ฒƒ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—). ์ด๊ฒƒ์€ ๋‹จ์ง€ ๋†๋‹ด์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
npm i -D jest typescript ts-jest @types/jest
jest.config.js ํŒŒ์ผ์—์„œ:
transform: { "\\.js$": "ts-jest", transformIgnorePatterns: [], },
Jest๋Š” js ํŒŒ์ผ์ด ์ปดํŒŒ์ผ๋˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” typescript์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ tsconfig.json ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
{ "compilerOptions": { "allowJs": true, "module": "commonjs", "noImplicitAny": true, "removeComments": true, "preserveConstEnums": true, "sourceMap": true } }
๋ชจ๋“  babel ๊ด€๋ จ ๊ตฌ์„ฑ ๋ฐ ํŒŒ์ผ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. npm ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
"scripts": { "test": "jest --runInBand --detectOpenHandles --no-cache --config ./jest.config.js" }
์ˆ˜์ž…ํ’ˆ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋น„์Šทํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ JS ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•˜๋Š” ์„ค์ •์ด์žˆ๋Š” ๋ฒ ์–ด ๋ณธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋ˆ„๊ตฌ๋“ ์ง€ JS ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™ํ•˜๋Š” ์„ค์ •์ด์žˆ๋Š” ๋ฒ ์–ด ๋ณธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/kasvtv/react-starter

์›๋ž˜ ํ† ๋ก ๊ณผ ๊ด€๋ จ์ด ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋™์•ˆ ์ด ํŽ˜์ด์ง€๋ฅผ ์ฐพ์€ ์‚ฌ๋žŒ์œผ๋กœ์„œ. ๋‚ด ๋ฌธ์ œ๋Š” https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports์— ์„ค๋ช…๋œ ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค https://github.com/airbnb/babel-plugin-dynamic-import-node ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ .babelrc๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

{
    ...
    "env": {
        "test": {
            "plugins": ["dynamic-import-node"]
        }
    ...
}

๋‚œ ๊ทธ๋ƒฅ ์˜ต์…˜์„ ์ œ๊ฑฐ :{ module:false }, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

"presets": [
    ["@babel/env", {module: false} ],  
    "@babel/preset-react",
    "@babel/preset-typescript"
  ]

jest config์— transformIgnorePatterns: [] ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  babelrc์— transform-es2015-modules-commonjs ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋†๋‹ด: ^23.1.0,
๋ฐ”๋ฒจ: 6.26.3

@ngmgit ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ชจ๋“  node_modules๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งค์šฐ ์ตœ์ ์ด ์•„๋‹™๋‹ˆ๋‹ค...

๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š”,
.babelrc ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹คํ•˜์ง€๋งŒ ๋‚œ์— ๋™์ผํ•œ ์„ค์ •์„ ์ด๋™ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ .babelrc ์— babel.config.js .

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ํŽ˜์ด์Šค๋ถ์˜ ๊ณต์‹ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ทธ ์ •๋„๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ๋ฏฟ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ €๋Š” 8๋…„ ์ด์ƒ์˜ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ๊ฐœ๋ฐœ์ž์ด๊ณ  ๋งŽ์€ ๋ฌธ์ œ์™€ ์งˆ๋ฌธ์„ ํ†ตํ•ด ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ํ•˜๋ฃจ ์ค‘ 5์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์—.

jest + react-testing-library์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๋ฐ˜์‘ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹จ์ง€ jest๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ๋‚˜์—๊ฒŒ ๋งค๋ฒˆ ๊ณ ํ•จ์„ ์ง€๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•˜๋‚˜์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. babel์ด ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ •๋ง๋กœ ํฌ๊ธฐํ•œ ๊ฒƒ์„ ์ง„์‹ฌ์œผ๋กœ ๋๋‚ด๊ณ  ๋” ์ด์ƒ ์‹œ๊ฐ„์„ ๋ณด๋‚ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํ”„๋กœ์ ํŠธ์— ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์ทจ์†Œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง„์ง€ํ•˜๊ฒŒ, jest + react-testing-library๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜์‘ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ SO ๋‹ต๋ณ€ ๋ฐ github ๋ฌธ์ œ๋กœ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ์‹œํ–‰ ์ฐฉ์˜ค๋ฅผ ๊ฒช์€ ํ›„ @cpojer ์˜ ๋‹ต๋ณ€์ด ์ €์—๊ฒŒ

๋‚˜๋ฅผ ๋„์šด ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ๋กœ ์ตœ์‹  ๋ฐ ๊ฐ€์žฅ ํฐ ์—…๋ฐ์ดํŠธ:

babel.config.js

module.exports = {
  "env": {
    "production": {
-      "plugins": ["transform-es2015-modules-commonjs"]
# new kid on the block
+      "plugins": ["@babel/plugin-transform-modules-commonjs"]
    }
  }
}

jest.config.js

module.exports = {
  // if you're also using typescript
  preset: "ts-jest",
  testEnvironment: "node",
  verbose: true,
  // registers babel.config.js with jest
  transform: {
    "^.+\\.js$": "babel-jest",
  },
  // explicitly include any node libs using ESM modules
  transformIgnorePatterns: ["node_modules/?!(<ESM module here>|<another here>|<etc...>)"],
}

์ข…์†์„ฑ:

์ด ๋ฌธ์ œ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ jest๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์„ ๋•Œ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค...

react-native ๋˜๋Š” jest-expo ์‚ฌ์ „ ์„ค์ •์„ ์‚ฌ์šฉ ์ค‘์ด๊ณ  ํ”„๋กœ์ ํŠธ์— .js ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ jest ๊ตฌ์„ฑ์—์„œ ์ผ์น˜ํ•˜๋„๋ก transform ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://jestjs.io/docs/en/configuration.html#transform -objectstring-pathtotransformer--pathtotransformer-object์˜ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

transform: { '^.+\\.[jt]sx?$': 'babel-jest' }

pnpm ์ง€์›

pnpm ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๋ฉ”๋ชจ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค....

๋‹ค์Œ ์˜ˆ์ œ๋Š” pnpm ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— pnpm ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ •๊ทœ์‹์€ ๋ณ‘ํ•ฉ๋œ node_modules ๋””๋ ‰ํ† ๋ฆฌ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

/xxx/node_modules/.pnpm/[email protected][email protected][email protected]/node_modules/antd/es/input/String

์ฐธ์กฐ: https://regexr.com/5cs2h

"transformIgnorePatterns": [
  "node_modules/(?!(react-native|my-project|react-native-button)/)"
]

https://jestjs.io/docs/en/tutorial-react-native#transformignorepatterns - ๋งž์ถคํ™”

๊ณ ์น˜๋‹ค

.* ๋ฅผ ์ถ”๊ฐ€ ํ•˜์—ฌ ๋งˆ์ง€๋ง‰ ๋ฐœ์ƒ์— ๋Œ€ํ•ด ๋ถ€์ •์ ์ธ ์˜ˆ์ธก์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

node_modules/(?!(.*antd/es)/)
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰