๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ํ์ฌ CommonJS ์คํ์ผ require()๊ฐ ์๋ RequireJS์ ํจ๊ป ์ด๊ฒ์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. RequireJS์ ๋ํ ์ง์์ ์ถ๊ฐํ ๊ณํ์ด ์์ต๋๊น? ์ฌ์ง์ด ์คํ ๊ฐ๋ฅํฉ๋๊น?
++
Jest์ ๋ํ ๋ชจ๋ ์์คํ ์ถ๊ฐ ๊ธฐ๋ฅ(์: require.js, es6 ๋ชจ๋ ๋ฑ)์ ์ง์ํ๋ ๋ก๋๋งต์ ์์ง๋ง ๋ถํํ๋ ์์ง ๊ฑฐ๊ธฐ๊น์ง๋ ๋๋ฌํ์ง ๋ชปํ์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ์งํ ์ํฉ์ ์ถ์ ํ๊ธฐ ์ํด ์ด ๋ฌธ์ ๋ฅผ ์ด์ด ๋ก๋๋ค. require.js ๋ก๋๋ฅผ ์ง์ํ๋ ๊ฒ์ด ๋งค์ฐ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@jeffmo ์นํฉ ์ commonjs/es6/amd๋ฅผ ์ง์ํฉ๋๋ค. ๋๋ด์ ํ๋ฌ๊ทธ์ธ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค๋ฉด ์๋ง ๊ทธ ๋ชจ๋ ๊ฒ์ ๋ฌด๋ฃ๋ก ์ป์ ์ ์์ ๊ฒ์ ๋๋ค.
++
์ฐ๋ฆฌ๋ ํฐ ์กฐ์ง์ ๋ง์ ํ๋ก์ ํธ๊ฐ ์๊ณ jest๋ฅผ ์ฌ์ฉํ ๊ณํ์ด์ง๋ง 100% requirejs์ ๋๋ค. requirejs ํตํฉ์ ๋ํ ๋ชจ๋ ์์?
++
๋๋ด๋ ํด๋ณด๊ณ ์ถ์ง๋ง ํ์ฌ ์งํ ์ค์ธ ํ๋ก์ ํธ๋ RequireJS๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
:+1:
๋๊ตฐ๊ฐ ์ด๊ฒ์ ์ฌ์ผ๋ก ์ฌ์ฉํ์๊ณ ์ ์ํ๋๋ฐ ์๋ฌด๋ ์๋ํ์ง ์์์ต๋๊น?
_์ฃผ์ ์ฌํญ์ผ๋ก ๊ฐ๋ฅ_. ์์๋ฐฉํธ ์ผ๋ก ํธ๋ฆญ์ ์ํํ ์ ์๋ ์์์ ์ ์ฅ์ ์์ nodefy ๋ก ์ฝ๊ฐ์ ๋น๋๋ฅผ ๊ตฌํํ์ต๋๋ค. ํจํค์ง ์๋์ scripts.cjs๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
Litmus ํ ์คํธ: AMD ๋ชจ๋ ๋ณ์นญ์ node_modules ์๋์ ํด๋น ๋ชจ๋๊ณผ ์ ๋ ฌ๋ฉ๋๋ค . ๋ฆฌํธ๋จธ์ค ํ ์คํธ๊ฐ ์คํจํ์ง๋ง ์ ๋ง์ ์ด๋ผ๋ฉด ์์ AMD ๋ชจ๋์ nodefyํ๊ฑฐ๋ node_modules์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ๊ทธ ์์ด๋์ด๋ ๋๋ฅผ ์ฌํ๊ฒ ํฉ๋๋ค. ๋ด ๊ด์ ์์, ๋ด๊ฐ ์ฌ์ฉํ๋ ์ธ๋ถ ์ฅ์น๋ UMD๋ฅผ ๊ตฌํํ๊ณ ๋ด AMD ๋ณ์นญ๊ณผ ์ผ์นํ๋ ์ด๋ฆ์ npm์ผ๋ก ์ค์นํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ํฐ ๋ฌธ์ ๋ ์๋๋๋ค.
(๋๋ nodefy ์ ์ uRequire๋ฅผ ์ฒดํฌ ์์ํ์ง๋ง CommonJS ํ
ํ๋ฆฟ ์ ๊ธฐ๋ฅ์ ์ผ๋ก nodefy์ ๋์ผํ๊ฒ ๋ ๋๋งํฉ๋๋ค. ๋์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค. amdefine๋ ํ์ธํ์ง๋ง jest๋ 'require'์์ ์ ๊ท์ ์ผ์น๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๋ง๋ ์ต๋ช
์ AMD๊ฐ ์์ ์ ์์ต๋๋ค. ํญ์ UMD๊ฐ ์์ง๋ง document
๋ ํผ๋ฐ์ค๊ฐ ํฉ์ด์ ธ ์๋ UMD๋ฅผ ์ฝ๋ฉํ๋ ๊ฒ์ ๋งค๋๊ฐ ์ข์ง ์์ต๋๋ค.)
+1
++
์ฐ๋ฆฌ๋ ๋ชจ๋ ์๋ก์ด ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋์์ react, backbone ๋ฐ requirejs๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋๋ด์ ์ฌ์ฉํ๊ณ ๋ฐ์ ํ ์คํธ์ ๊ณ ํต์ ์ํํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋จ์ ์์ค์ผ๋ก ๋ฌผ๊ฑด์ ๋ฎ์ถ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค. ํ์ฌ ๋ฐ์ ์ฝ๋์ ๋ํ ํ ์คํธ๋ rspec ๋ฐ webdriver๋ก ์ํ๋๊ณ ์์ต๋๋ค. ์ด๊ฒ์ด ์๋ํ๋ ๋์ ๋ช ๋ฐฑํ ์ด์ ๋ก ์ด์์ ์ด์ง ์์ต๋๋ค.
์์ง ์ค์ฉ์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๋ด๊ฐ ๊ฒช๊ณ ์๋ ์ฃผ์ ๋ฌธ์ ๋ ๋ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ํํ๋ ์ ์ ๋ฌธ์ ๋๋ค.
+1
@petehunt ์ ๋ฅผ Webpack์ผ๋ก
+1
๋๊ตฐ๊ฐ ์ฝ๋ ์ ์ฉ์ผ๋ก ๋ธ๋ผ์ฐ์ ํ ์คํธ๋ฅผ ์คํํ๋ jasmine/webpack ๋๋ jest/webpack์ ์๋ฅผ ์๋ ค์ค ์ ์์ต๋๊น?
++
์ฐ๋ฆฌ๋ ์ธ์ requirejs์ ๋ํ ์ง์์ ๊ธฐ๋ํ ์ ์์ต๋๊น?
+1
+1
+1
+1
+1
+1
์ ์ ํธ์ถ์ ๋ํด return ๋์ module.exports๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ ์ฒ๋ฆฌ๊ธฐ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋๋ฅผ ์ํด ์๋ํฉ๋๋ค :์์ง์๊ฐ๋ฝ:
// preprocessor.js
var ReactTools = require('react-tools');
module.exports = {
process: function(src) {
if (/define\(.*?\{/.test(src)) {
//Remove AMD ceremony for use without require.js or almond.js
src = src.replace(/define\(.*?\{/, '')
.replace(/(}\);|}\))$/,'');
}
return ReactTools.transform(src);
}
};
++
+1
+1
RequireJS ์ง์ +1
+1
@charliedowler ์ด ์ ๊ทผ ๋ฐฉ์์ ์กฐ๊ธ ๋
if (typeof(module) == 'object' && module.exports) { module.exports = <my_element>; }
๊ทธ๋ฌ๋ return
ํ๊ณ ์์ผ๋ฏ๋ก ์ ์ฒ๋ฆฌ๊ธฐ์์ ํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋๋ ๋ง์ง๋ง ๋ฐํ๊ณผ ์ผ์นํ๋๋ก RegEx๋ฅผ ํ์ฅํ์ฌ ๋ฒ์ด๋ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ํ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. "๋ถ๋ฒ ๋ฐํ ๋ช
์ธ์" ์ค๋ฅ๊ฐ ๊ณ์ ๋ฐ์ํฉ๋๋ค. ์๋ง๋ ํํ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
if (/define\(.*?\{/.test(src)) {
src = src.replace(/(define\(.*?\{|return.*[\s]}\);?$)/g,'');
}
src
๋ฅผ stdout์ ์ฐ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๊ฐ๋จํ console.log๊ฐ ์๋ํ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก, ์ด ๋ชจ๋ ๊ฒ์ด ์๋ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ข ์์ฑ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๊ณ ์์ต๋๊น? ์๋ฅผ ๋ค์ด React?
+1
์! ๋๋ (๊ทธ๋ฆฌ๊ณ ๋งค์ฐ ์ฆ๊ฒ๊ฒ ๋๋ด์) ๊ฐ์ง๊ณ ๋๊ณ ์์๋ค. ์ค๋ ์ค์ ํ๋ก์ ํธ๋ก ๊ฐ์ ธ์ค๋ ค๊ณ ์๋ํ์ง๋ง ํ์ฌ ๋ชจ๋ "์ค์ " ํ๋ก์ ํธ์ ๋ํ requireJS ์ง์ :sob: ... ๊ฑฐ๋ ์ฐจ๋จ๊ธฐ๊ฐ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ฐธ์ผ๋ก ์ฌํ๋ค. ํ์คํ ํฅ๋ฏธ๋ก์ด ์์ด๋์ด์์ต๋๋ค!
:+1:
+1
+1
:+1:
:์์ง์๊ฐ๋ฝ:
:+1:
:+1:
๊ทธ๋์ ์นํฉ์ ์ฌ์ฉํ์ฌ AMD ๋ชจ๋๊ณผ ํ ์คํธ๋ฅผ ํจ๊ป ์ปดํ์ผํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ ์ข ๋ฅ์ ์ถ๊ฐ ๋ก๋๋ฅผ ํ ์คํธ์ ์ฌ์ฉํ ์ ์์์ต๋๋ค. https://github.com/ninjapanzer/Backbone-Flux-React-Webpack
:+1:
+1
+1
+1
์ด ๋ฌธ์ ๋ฅผ ์ ๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํ๊ณ ์ํดํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๋ฅผ ํต์ฌ ํ์ ์๋ ธ์ต๋๋ค. ์์ผ๋ก 30์ผ ์ด๋ด์ ๋ต๋ณ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ผ๋ฉฐ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ์ข ๋ฃ๋ ์ ์์ต๋๋ค.
+1
@facebook-github-bot-4 ํด์ฃผ์ธ์!
+1
+1
++
Webpack์ ์ง์ํ๊ธฐ ์ํด Jest์ 'HasteModuleLoader'๋ฅผ ๋์ฒดํ๋ Jestpack์ ๋ํด ์์ ํด ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก AMD๋ฅผ ํฌํจํ์ฌ Webpack์ด ์ง์ํ๋ ๋ชจ๋ ๋ชจ๋ ์์คํ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก Jestpack์ ์ฑ๋ฅ์ ํ ์คํธํ๋ ๋ฐ ์ ๋ง ์ ์ฉํ FB ์คํ์ผ์ ์๋๋ฌ ๋ชจ๋์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ ์ธ์ Jest๋ฅผ ์ฌ์ฉํ๋ ๋๊ท๋ชจ(ish) ์คํ ์์ค ํ๋ก์ ํธ์ ๋ํด ์๋ ์ฌ๋์ด ์์ต๋๊น?
๋ํ jest-requirejs
ํ๋ก์ ํธ main.js
๊ตฌ์ฑ ํ์ผ์ ๋ถ์ํ ๋ค์ deamdify
์ ์ ๊ฑฐํ๋ define
๋ํผ๋ main.js์ ์ง์ ๋ baseUrl ๋ฐ ๊ฒฝ๋ก์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ ๊ฒฝ๋ก๋ฅผ ๋ค์ ์์ฑํ ๋ค์ ๋ณํ๋ ํ์ผ์ ํ์์ ๊ฐ์ด jest์ ์ ๋ฌํฉ๋๋ค.
์ฌ์ ํ ํ๋ฌ๊ทธ์ธ/๋ก๋ ๊ตฌ๋ฌธ์ ๋ํด ์์
์ค์ด๋ฉฐ ํ
์คํธ ํ๊ฒฝ ๋ด์์ jest.dontMock("")
, jest.setMock("")
๋ฐ require.requireActual("")
๊ฒฝ๋ก๋ฅผ ๋ค์ ์์ฑํฉ๋๋ค.
์๋ค์ ์ด๊ฑฐ ์ง์ง ๋๋ฐ์ด๋ค. ์ ๋ Jestpack์ ์์ด๋์ด๊ฐ ๋ง์์ ๋ค๊ณ ์ถ๊ฐ ๋ชจ๋ ํด์๊ธฐ๋ฅผ ํจ์ฌ ์ฝ๊ฒ ์ง์ํ๋๋ก ๋ง๋ค์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ์น์ฌ์ดํธ๋ฅผ ๊ฐํธํ๊ณ ์์ํ๊ธฐ ๊ฐ์ด๋์ ์ผ๋ถ๋ก Jestpack๊ณผ ๊ฐ์ ์๋ฃจ์ ์ ์ถ์ฒํ๊ณ ์ถ์ต๋๋ค. @richardscarrott ๋ฐ @sterpe ํ์ํ ๊ฒ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค.
๋ํ cc @mwolson ๋ฐ @ColCh
(๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์๊ฒ: ๋๊ธ์ ์ฐฌ์ฑ ํฌํ๋ฅผ ์ค์งํ์ธ์. ๋์์ด ๋์ง ์์ต๋๋ค. ๋๋ด์ ์ํด ๋น๋๋ ๊ฒ์ ์ํ๋ฉด ๋์ด์ค๊ธฐ ์์ฒญ์ ๋ณด๋ด์ญ์์ค. ์ฝ๋๊ฐ ๋ ผ์์ ์ด๊น๋๋ค! ๊ฐ์ธ์ ์ผ๋ก ์ปค๋ฎค๋ํฐ์ ์ฌ๋๋ค์ด ๊ธฐ๋ฅ์ ํ์๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ์ ์ฐ์ ์์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๊ฑฐ๊ธฐ์ ์๋ _๋ชจ๋ ๋ชจ๋ ๋ก๋_๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.).
Jestpack์ ํฅ๋ฏธ๋กญ์ง๋ง ํ ์คํธ๋น ํ๋์ ์ง์ ์ ์ ์์ฑํด์ผ ํ๋ ํฌ์ ์๋๋๋ค. https://github.com/Ticketmaster/jest-webpack-alias ๋ ์นํฉ์ ๋ชจ๋ ํ์ธ ์ฝ๋๋ฅผ ๋ค์ ๊ตฌํํ์ฌ ์ผ๋ถ ์ ์ฒ๋ฆฌ ๋ฐ ์์ง ๋ฐ๊ฒฌ๋์ง ์์ ๋ฒ๊ทธ๋ฅผ ํฌ์ํ์ฌ ๋ฌธ์ ๋ฅผ ์ข ๋ ์ผ๋ฐ์ ์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
๋ํ ์์ํ๊ธฐ ๊ฐ์ด๋์์๋ ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์คํ๋๋ ํ์ผ์ ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค(์๋ ๊ฒฝ์ฐ). ๊ทธ๋ ์ง ์์ผ๋ฉด ํ ์คํธ ์คํ ์๋๊ฐ ์๋นํ ๋๋ ค์ง๋๋ค.
์ ์ฒ๋ฆฌ๊ธฐ๋ ํ ๋ฒ๋ง ์คํ๋๋ฉฐ ์บ์ ํค ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค. jest๋ ํ์ผ์ด ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ค์ ์คํํ์ง ์์ต๋๋ค.
๊ทธ๋ด ์๋ ์์ง๋ง ์ฒซ ๋ฒ์งธ ์คํ๋ง์ผ๋ก๋ ํ ์คํธ ์ค์ํธ ์คํ์ ์ฝ 10์ด๋ฅผ ์ถ๊ฐํ๊ธฐ์ ์ถฉ๋ถํ์ต๋๋ค.
๋น ๋ฅด์ง ์๋ค๋ ๋ฐ ๋์ํ์ต๋๋ค. FB์์ ์ฒซ ๋ฒ์งธ ์คํ์ ํ์ ์คํ๋ณด๋ค ๊ฑฐ์ ๋ ๋ฐฐ๋ ์ค๋ ๊ฑธ๋ฆฌ์ง๋ง ๊ฐ์ธ์ ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. FB์์ babel ๋ฐ ๊ธฐํ ์ฌ์ฉ์ ์ง์ ๋ณํ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ ์ฒ๋ฆฌ๊ธฐ ์์ด ํ ์คํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค :)
์ ์ฒ๋ฆฌ๊ธฐ ์บ์ฑ์ requirejs ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๊ฐ๋ฐํ๋ ๋์ ์ ๋ฅผ ๋ฌผ๊ณ ์์์ต๋๋ค. ๋๋ ๋๋ถ๋ถ ์ฌ์ ํ ์บ์ฑ์ด ์๋ [email protected] ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
0.5์์ ์ ์๋ํด์ผํฉ๋๋ค!
Webpack์ dev-watch ๋ชจ๋์์ ๋งค์ฐ ๋น ๋ฆ ๋๋ค.
์๋ํ๋ฉด:
๊ทธ๋์ ์ Jest ์ ์ฒ๋ฆฌ๊ธฐ์์๋ (2) ํฌ์ธํธ๋ง ๊ตฌํํ์ต๋๋ค.
๊ฐ๋จํ ๋งํด์ Jest ๋ฐ Webpack ์์ ์๋ ํจํค์ง( ๋ฉ๋ชจ๋ฆฌ FS ์์ ์ปดํ์ผํ๊ณ , ๋ฉ๋ชจ๋ฆฌ FS ์์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์คํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๊ฒ ์ ๊ด์ ์ ๋๋ค...
๊ทธ๋ฌ๋ ์ง๊ธ ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ์ฌ๋ก์๋ ๋ฉ๋ชจ๋ฆฌ FS ๋ฅผ Jest ์ ์ฃผ์ ํ ์ ์์ต๋๋ค.
์ปดํ์ผ๋ ์์ค๋ฅผ ์บ์์ ๋ฐ๋ก ์ฃผ์ ํ๊ธฐ ์ํด ๊ฐ์ธ Jest ์บ์ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์๊ฐํ์ต๋๋ค. ํดํน ์ผ ์ ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์์ ํ๋ ธ์ต๋๋ค. jest-webpack/issues/4#issuecomment-98623189
์, Webpack ์ ์ ์ฒ๋ฆฌ Karma ๋ ๋งค์ฐ ๋๋ฆฌ๊ฒ ์๋ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฃผ์ ์ฑ๋ฅ ์ ํ๊ฐ ํ์ผ ๊ฐ์ webpack ๋ฐํ์ ์ฌ๋ก๋ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@cpojer ๋๋ ๊ทธ๊ฒ์ด ์ด๋ฏธ ์ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ๋ชจ๋ ๋ก๋๋ฅผ ๊ตฌ์ฑ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ฒ์ด ๋น์ ์ ์๋๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ Jestpack์ผ๋ก ๊ทธ๊ฒ์ ์ฐ๋ฌ ์ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๋ด๊ฐ ๋ง๋ ์ ์ผํ ์ง์ง ๋ฌธ์ ๋ node_modules https://github.com/facebook/jest/issues/509 ์ ๋ํ ์๋ ๋ชจ์๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ ์ํ ๋ ผ๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ด์์ต๋๋ค. ๋๋ ๊ฒฐ๊ตญ ๋์๊ฒ ์๋ฏธ๊ฐ ์๋ ์๋ฃจ์ ์ ์ฌ์ฉํ๊ฒ ๋์์ง๋ง ๋ง์ฝ ๋น์ ์ด Jestpack์ ๋ชจ๋ ๋ก๋๋ฅผ HasteModuleLoader์ ์ ๋ ฌํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ ๋๋ค.
@mwolson Jestpack ์ด ํ ์คํธ ํ์ผ๋ง๋ค ๋ณ๋์ ์ง์ ์ ์ ์ฌ์ฉํ๋ ์ด์ ๋ Jest์ ๋ค์ค ํ๋ก์ธ์ค๋ฅผ ๊ณ์ ํ์ฉํ ์ ์๋๋ก ํ๊ธฐ ์ํด์์ ๋๋ค.
์ค์ ๋ก moduleLoader
๋ ์ด๋ฏธ ๊ตฌ์ฑ์ ์ผ๋ถ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
++
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ํฉ๋๋ค. Jest๋ ํ๋ฅญํ ์ํํธ์จ์ด์ฒ๋ผ ๋ณด์ด์ง๋ง RequireJS ์ง์์ด ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒ์ ๋ค์ ์์ฑํ ์๋ ์์ต๋๋ค.
+1
์ปค๋ฎค๋ํฐ์์ ์ด ์์ ์ ๊ด์ฌ์ด ์๋ ์ฌ๋์ด ์์ต๋๊น? ๋๋ ์ด๊ฒ์ ํตํด ์ฌ๋๋ค์ ์ง์ํ๊ณ ๊ณต์ Jest ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ์กฐ๋ง๊ฐ FB์์ ์ด์ ๋ง๋ํ ํฌ์๋ฅผ ํ ๊ฒ ๊ฐ์ง๋ ์์ต๋๋ค. Jest ํ์ ๋งค์ฐ ์์ผ๋ฉฐ(1.5๋ช ) ๋ถํํ๋ ์ด๋ฌํ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ํด ์์ ํ ์ ์์ต๋๋ค.
JavaScript ์ปค๋ฎค๋ํฐ ๋ฐ ํ์ค์ ํ์ฌ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด require js ์์ฒด๊ฐ JavaScript ์ฝ๋ ์์ฑ์ ํฐ ๋ฏธ๋๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ์ด์ ES2015์ ํ์คํ๋ ๋ชจ๋ ์์คํ ์ด ์์ต๋๋ค. Babel๊ณผ Jest๋ ์ด์ ์์ ํ ํตํฉ๋์์ผ๋ฉฐ ํจ๊ป ์ ์๋ํฉ๋๋ค. ๋๋ ๋๊ตฌ์๊ฒ๋ CommonJS ๋๋ ES2015 ๋ชจ๋๋ก ์ ํํ ๊ฒ์ ๊ถ์ฅํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ฆ์ ์ฌ์ฉํ ์ ์๋ ๋ ๋ง์ ๋๊ตฌ๊ฐ ์ ๊ณต๋ฉ๋๋ค.
require JS์๋ CommonJS๋ฅผ ํ๋ก๋์ ๋ฐฐํฌ์ ์ฌ์ฉํ ์ ์๋ require.js๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์๋ ์์ต๋๋ค. http://requirejs.org/docs/commonjs.html ์ฐธ์กฐ
๊ฐ์ธ์ ์ผ๋ก require JS๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ์๋ ์๋ฌด๋ฐ ์ด์ ์ด ์์ต๋๋ค. ๋ํ require JS ์ฝ๋๋ฒ ์ด์ค๋ฅผ CommonJS๋ก ๋ณํํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ codemod ๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ requireJS๋ฅผ CommonJS babel ํ๋ฌ๊ทธ์ธ์ ์์ฑํ๊ณ Jest์ ์ ์ฒ๋ฆฌ๊ธฐ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋๋ค.
@cpojer ์ฌ๊ธฐ https://github.com/sterpe/jest-requirejs/blob/master/index.js ์์ ์ ์ฒ๋ฆฌ๊ธฐ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๋ค์ ์ฑ๊ณตํ์ง๋ง ์ง๊ธ๊น์ง๋ !text/ ํ๋ฌ๊ทธ์ธ์ ๋ํ ๋ณํ๋ง ๊ตฌํํ์ต๋๋ค. ์ฐ๋ฆฌ ํ์ requirejs์์ ์์ ํ ๋ฒ์ด๋ฌ๊ธฐ ๋๋ฌธ์ ๊ทธ ๊ธธ์ ๊ณ์ ๊ฐ ์ด์ ๊ฐ ์์์ต๋๋ค.
๋์ํฉ๋๋ค. ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด RequireJS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฑฐ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. CommonJS/ES2015 ๋ชจ๋ ์ฝ๋๋ฅผ ํ๋ก๋์ ์ฉ requirejs๋ก ์ปดํ์ผํ๋ ๊ฒ์ด ์ดํด๊ฐ ๋์ง๋ง ์ด ์คํ์ผ๋ก ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ๊ฒ์ ์ข์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐฉ๊ธ RequireJS์์ webpack์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ต๋๋ค. ์ฝ๋๋ฒ ์ด์ค์๋ 300๊ฐ ์ด์์ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค. ์ ์ฒด ๊ณผ์ ์ ๋๋ผ์ธ ์ ๋๋ก ์ฝ๊ณ ๊ณ ํต์ค๋ฝ์ง ์์์ต๋๋ค.
๋ด๊ฐ ์ฌ์ฉํ ๋๊ตฌ๋ AMD์์ CommonJS ์คํ์ผ๋ก ์ฝ๋๋ฅผ ๋ณํํ๊ธฐ ์ํด https://github.com/Skookum/recast-to-cjs ์์ต๋๋ค.
๋ํ https://github.com/facebook/jscodeshift ์ ๋์์ผ๋ก ๋ฉฐ์น ๋ด์ ์ฝ๋ ๊ธฐ๋ฐ์ React 0.11์์ 0.14๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ต๋๋ค.
์ด๊ฒ์ด ๊ฐ์ ์ํฉ์ ์๋ ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@ํ ๋ํธ ๊ตฟ ! ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ ๊ฐ ์ ์ ๋งํ๋ ๊ฒ์ ๋๋ค. :) ๊ทธ๊ฒ์ด ๋น์ ์ ์ํด ์ ์๋ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์ฉ๋๋ค.
๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://github.com/1twitif/testRequireJSAmdModulesWithJest
์ ์ด๋ ์ด ์ฌ์ฉ ์ฌ๋ก์์๋ ์๋ํฉ๋๋ค.
http://stackoverflow.com/questions/33889662/not-able-to-load-amd-modules-through-jest
์ด๊ฒ์ด ๋ซํ ์๊ธฐ ๋๋ฌธ์ Facebook์ด ์ด์ ๋ํ ์ง์์ ์ถ๊ฐํ์ง ์์ ๊ฒ์์ ์๋ฏธํฉ๋๊น?
Facebook์ด ์ ๋ฅผ ์๋ฏธํ๋ค๋ฉด ์, "๊ณต์์ ์ธ" ์ง์์ด ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๋ค๊ณ ํด์ Jest์ ๊ธฐ์ฌํ๊ณ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์ ์๋ ์์ง๋ง ์์ฆ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ES ๋ชจ๋์ด๋ CommonJS๋ก ์ด๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ค, ์์์. ๋ถํํ๋ ๋๋ ์ ๋ฌด์ฉ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ข ์์ฑ์์ ๋ฒ์ด๋ ์ ์์ต๋๋ค.
babel-plugin-transform-amd-to-commonjs ๋ ํนํ babel-jest์ ๊ฐ์ ๊ฒ์ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ๊ฒฝ์ฐ Jest+AMD ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
ํ ์คํธ ํ๊ฒฝ์์ ๋ณํ์ ์คํํ์ฌ Jest๊ฐ AMD ํ์ผ์ ํฌ๋ช ํ๊ฒ ์๊ตฌํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ์์ ํ๋ก์ ํธ ๋ฅผ ์ค์ ํ์ต๋๋ค.
์ค์ ํ๋ก์ ํธ์์ ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ธ๋ถ ์ฌํญ์ด ํ์คํ์ง ์์ต๋๋ค. ํนํ Jest/RequireJS/Webpack/etc ๊ฐ์ ๊ตฌ์ฑ ๊ณต์ ์ ๋ํ ์ข์ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. .js ๊ตฌ์ฑ ํ์ผ์ ๋ํ Jest ์ง์์ ๋ณด๋ค ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ํฅํ ๋จ๊ณ๊ฐ ๋ ๊ฒ์ ๋๋ค(https://github.com/facebook/jest/issues/2140 ์ฐธ์กฐ).
@msrose ๊ต์ฅํฉ๋๋ค. ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ์ค๋๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ๊ฐ๋จํ ๋ณํ์ด ์๋ํ ์ ์์ต๋๋ค.
exports.process = function (content) {
return 'function define(name, deps, body) { module.exports = body.apply(undefined, deps.map(require)); }' + content;
}
AMD -> CJS์ ๋ณํ์ ์๋ฅผ ๋ค์ด deamdify
, ๋ํผ ์ฝ์
๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ํํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ ํ ํด๊ฒฐ๋์ง ์์ ๋ฌธ์ ๋ Require ์คํ์ผ ๋ก๋/ํ๋ฌ๊ทธ์ธ ๊ตฌ๋ฌธ์
๋๋ค. fooTemplate = require('tpl!foo.tpl')
๋ฐ barJson = require('json!bar.json')
(์๋์ ์ผ๋ก ์ผ๋ฐ์ ์ธ ๊ฒ)์ ๊ฐ์ ํญ๋ชฉ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ๋ค์ด ์๋นํ ๋ง์๊ณ ์ค์ require-js
ํ๋ก์ ํธ์๋ ์ด๋ฐ ์ข
๋ฅ์ ๊ตฌ๋ฌธ์ด ํฉ์ด์ ธ ์์ต๋๋ค.
๊ถ๊ทน์ ์ผ๋ก jest
์ ๋ชจ๋ ๋ก๋์ ๊ณต๊ธ๋๋ ๋ณํ ์์คํ
์์ ๊ธฐ์กด require-js
ํ๋ฌ๊ทธ์ธ์ ์ง์ ์ฌ์ฌ์ฉํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
+1
ReferenceError: define is not defined
+1
srcApp.test.js ์คํจ
โ ํ
์คํธ ์ค์ํธ ์คํ ์คํจ
ReferenceError: define is not defined
amd ๋์ umd๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง ์๋ค๋ฉด ๋ณํ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค(์: ์์ ๋งํฌ๋ babel ํ๋ฌ๊ทธ์ธ).
loader!
๊ตฌ๋ฌธ์ ๊ดํด์๋ ์ด๋ฅผ ์ง์ํ์ง ์์ต๋๋ค(Webpack์์๋ ์ง์ํ์ง ์์ต๋๋ค). ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ณํํ๊ณ (๋ก๋ ์ ๊ฑฐ) Jest๊ฐ transform
๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ๋ณํํ๋๋ก ํ๋ ๊ฒ์
๋๋ค. ๊ด๋ จ ํ ๋ก : #4868
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
babel-plugin-transform-amd-to-commonjs ๋ ํนํ babel-jest์ ๊ฐ์ ๊ฒ์ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ๊ฒฝ์ฐ Jest+AMD ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
ํ ์คํธ ํ๊ฒฝ์์ ๋ณํ์ ์คํํ์ฌ Jest๊ฐ AMD ํ์ผ์ ํฌ๋ช ํ๊ฒ ์๊ตฌํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ์์ ํ๋ก์ ํธ ๋ฅผ ์ค์ ํ์ต๋๋ค.
์ค์ ํ๋ก์ ํธ์์ ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ธ๋ถ ์ฌํญ์ด ํ์คํ์ง ์์ต๋๋ค. ํนํ Jest/RequireJS/Webpack/etc ๊ฐ์ ๊ตฌ์ฑ ๊ณต์ ์ ๋ํ ์ข์ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. .js ๊ตฌ์ฑ ํ์ผ์ ๋ํ Jest ์ง์์ ๋ณด๋ค ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ํฅํ ๋จ๊ณ๊ฐ ๋ ๊ฒ์ ๋๋ค(https://github.com/facebook/jest/issues/2140 ์ฐธ์กฐ).