EcmaScript ๋ชจ๋์ ์ง์ํ๋ ํ๊ฒฝ์์ ์คํ๋๊ณ (์ฆ, Babel์ ์ฌ์ฉํ์ฌ ES5๋ก ํธ๋์ค ํ์ผ๋์ง ์์ ์์ ์๋ฏธ), ES ๋ค์ ์คํ์ด์ค๋ ์ฌ์์ ๋ฐ๋ผ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ผ์ข
์ default
ํจ์๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. Sinon์ด ์ด์ ๋ํด ํ ์์๋ ์ผ์ด ์์ผ๋ฏ๋ก์ด ์์
์ ์๋ ํ ๋ ๋ช
์ ์ ์ผ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค : 'ES Modules cannot be stubbed'
.
๊ทธ๋ฌ๋ @jdalton๋ํ๋ค esm
(๋ก๋ ECMA ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๊ฐ๋ฅํ๊ฒ ๋
ธ๋์ ๋ํ ๋ฐํ์ ๋ก๋ *.mjs
), ๊ทธ๋ฆฌ๊ณ Sinonํ๊ณ , ๊ทธ๋ ์ถ๊ฐํ๋ค์ฒ๋ผ ์ฌ์ฉํ์ฌ ์คํ
์ ์๋๋ก $ # $ 4 $ #์ mutableNamespace
์ต์
์์ esm
.
How to ์น์
์๋์ ํ
์คํธ ์คํฌ๋ฆฝํธ์ ํจ๊ป esm
๋ฐ ์ต์
์ ์ฌ์ฉํ์ฌ ๋
ธ๋๋ฅผ ์คํํ๋๋ก npm
๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ๋ฌธ์๊ฐ ์์ด์ผํฉ๋๋ค.
์ฐธ์กฐ :
๋๋ ์ด๊ฒ์ ์ ํํ๊ฒ ์ฐ๋ ๊ฒ์ ๋ํด ์๊ฐํ๊ณ ์์๋ค :)
์ "๋ฌธ์ ๋"๋ค์ํ ๋ฐฉ๋ฒ์ ๊ณผ๋ค ์๋ค๋ ๊ฒ์
๋๋ค esm
์ฌ์ฉ๋ ์ ์์ง๋ง, ์ฐ๋ฆฌ๋ ์ปค๋ฒ ์ ์ด๋ ๋ด๊ฐ ์๊ฐํ ๊ฒ๋๋ค ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ํตํดํด์ผ require
๋ฐ๋ ํ๋๊ทธ node
ํ๋ก์ธ์ค. ์ฌ๊ธฐ์ ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ์ฒดํํ๊ธฐ ์์ํ์ง๋ง ํ๊ฒฝ ๋ณ์๋ก json ๋ฌธ์์ด์ ์ ๊ณต ํ ์๋ ์์ต๋๋ค (์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ต์
ํด์ ์ธ์๋).
์๋ ํ์ธ์ @ fatso83!
cjs.mutableNamespace
์ต์
์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ผ๋ฏ๋ก ๊ตฌ์ฑ ํ ํ์๊ฐ ์์ต๋๋ค. ์คํฐ ๋น์ .js
์์๋ ์๋ํ์ง๋ง .mjs
.js
์์๋ ์๋ํ์ง ์์ต๋๋ค. _ ( .mjs
ํ์ผ์ด ์ ๊ฒจ ์์ผ๋ฏ๋ก esm
์ต์
์ด ์์ต๋๋ค) _.
@jdalton js
๋ mjs
๊ตฌ๋ถ์ ๋ํด ์๋ ค ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๊ฒ ์์ด ๋
์ ์ด ์๋ํ์ง ๋ชปํ๋์ง ์ค๋ช
ํฉ๋๋ค.
cc @ ์ง-ํน -2000
์ต์ ๋น์ฉ์ผ๋ก ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์ถ์ต๋๋ค. ์๋ฃจ์ ์ด ๋๋ฌด ๊น๋ค ๋กญ๋ค๋ฉด mock์ผ๋ก ๋จ์ ํ ์คํธ๋ฅผ ํฌ๊ธฐํ๊ณ ์ถ์ต๋๋ค. ๊ฒฐ๊ตญ, ๋ชจ์ ํ ์คํธ๋ ๊ฐ๋ ฅํ ์จ๋ผ์ธ ์์คํ ์ ๊ตฌ์ถํ๊ธฐ์ํ ํ์ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. ๊ทธ๋ฌ๋ ์ตํ์ ์๋จ์ผ๋ก sinon์ด ๋๋ฅผ ์ํด "proxyrequire"(๋๋ ์ด์ ์ ์ฌํ ๊ฒ)๋ฅผ ๋ํ ํ ์ ์์ต๋๊น?
@ jim-king-2000 ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์ต๋๋ค. ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ์์๋ ๋ชจ๋ ์์คํ ์ ์ฌ์ฉํ๋๋ก ๋ช ์ ์ ์ผ๋ก ์ ํํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ถํํ๋ ์ฌ๋ฌ๋ถ์ด ๋ถ๋ดํด์ผ ํ ๋น์ฉ์ ๋๋ค. ๋ชจ๋ ๋ก๋๋ฅผ ๋ํํ์ฌ ๋ชจ๋ ์ข ๋ฅ์ ์๋๋ฆฌ์ค (๋ ธ๋, ๋ธ๋ผ์ฐ์ , ํธ๋์ค ํ์ผ๋ฌ ํฌํจ / ์์ ๋ฑ)์์ ์๋ํ๋๋ก ๋ง๋๋ ๊ฒ์ ๋๋ฌด ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ์ด ํ๋ก์ ํธ์ ๋ช ์๋ ๋ชฉํ ์ ๊ด๋ จ
์ ๋ sinon๊ณผ ๋ชจ๋ ์์คํ ์ ๊ด๋ จ์ฑ์ ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค (์ฃ์กํฉ๋๋ค). ๋ด๊ฐ ํ์ํ ๊ฒ์ babel์ด์๋ js / node ๋ชจ์ ๋จ์ ํ ์คํธ ํ๋ ์ ์ํฌ (๋๋ ์๋ฐ ๋์ ๋ฌผ์ธ mockito์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ ๋๋ค. ๊ทธ๋์ ์กด์ฌํฉ๋๊น?
์์ปจ๋, ํน์ ํ์ ์์ฅ์ ๋ํด : ํ์ฌ๋ ์๋ : sob :
์ผ๋ฐ์ ์ผ๋ก : ์, ๊ฑฐ์ ๋ชจ๋ ํ๋ ์ ์ํฌ ๋ฐ ๋ฐํ์ ์กฐํฉ์ ๋ํด์ด๋ฅผ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
Java ์ฉ์ด๋ก๋ Java static
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฒด ์์คํ
์ ๊ตฌํ ํ ๋ค์ Mockito๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค๋ฅผ ๋ชจ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ํ ์ ์์ต๋๋ค.
์ฆ, ์์
์ ์ํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ *.mjs
ํ์ผ์ ์ด๋ฆ์ *.js
์
๋๋ค. ์๋ ค์ง ๋จ์ ์์ด ํ
์คํธ ๊ฐ๋ฅ์ฑ์ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ค์ฉ์ ์ธ ์ค๊ฐ ๋ฐฉ๋ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
์๋ฐ์ ์ ์ ํจ์ ๋ชจํน์ ์ํด powermock์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋น๊ต๋ฅผ ์์ ํ ์ดํดํ์ง ๋ชปํ ์๋ ์์ต๋๋ค. ๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๋๋ ์๋ฐ๋ฅผ ์ข์ํ์ง ์์ ์งํ๊ฐ ๋๋ฌด ๋๋ฆฝ๋๋ค. ์ด์ ์ฌ์ ํ async / await๋ฅผ ์ง์ํ์ง ์์ต๋๋ค .
๋๋ ๋ชจ๋ ๊ณณ์์ * .mjs๋ฅผ ์ฌ์ฉํ๊ณ , ๋ชจ๋ ์์ค ์ฝ๋๋ mjs ํ์ผ์ ๋๋ค. ๋ ๋์๊ฐ ๋ค์ ๋ฐ๋ฒจ์ ์์งํด์ผํ๋ค๋ ์๋ฏธ์ ๋๋ค (์ถ๊ฐ ๊ฐ๋ฐ / ๋ฐํ์ ์์ ๊ณผ ์ง์ ๋ถํ ํธ์ถ ์คํ ๋์ ). ํ ์คํธ ํ์ผ์ * .js๋ก ๋ค์ ๋ณ๊ฒฝํ ์๋ง ์์ผ๋ฉด ๊ด์ฐฎ์ต๋๋ค.
๋ค๋ฅธ ์ ๋น์ฉ ๋ฐฉ๋ฒ์ ์ฐพ์ ๋๊น์ง ๋ชจ์ (๋ค๋ฅธ ํ ์คํธ๋ ๊ทธ๋๋ก ์ ์ง๋จ)๋ก ํฌ๊ธฐํ ๊ฒ์ ๋๋ค.
@ fatso83 ๋์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋๊ตฌ๋ ์ง ํด๋ธ์ ์๋ ํ์ต๋๊น? ๐ค
์ฐธ๊ณ ๋ก, ๋ชจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ "testdouble.js"์์ Node.js ESM ์ง์์ ๊ตฌํํ์ต๋๋ค. ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์ ๊ตฌํ์ ๋ํด ์ผ์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ ๋ฐ์๋ค์ด๊ณ ์ถ๋ค๋ฉด ์ฌ๊ธฐ์์ ๊ธฐ๊บผ์ด ๋์ ๋๋ฆฌ๊ฒ ์ต๋๋ค ..
@giltayar ESM ์ง์ ๊ตฌํ์ ์ถํํฉ๋๋ค! ์ข์ ๊ธฐ์ฌ, btw. ์ฐ๋ฆฌ๋ ํญ์ ESM ๋ฐํ์์ ์ค์ ํ ๋ ES ๋ชจ๋ ์คํฐ ๋น์ด ๊ฐ๋ฅํ์ง ์๋ค๊ณ ๋งํ์ง๋ง, (์์ ๊ฐ์ด) ์ด๊ฒ์ด proxyquire, rewire ๋๋ ... Quibble๊ณผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ ์์ค์์ ์ฒ๋ฆฌ๋์ด์ผํ๋ค๊ณ ๋งํ์ต๋๋ค. ์ง์์ ์ถ๊ฐ ํ ์์น :)
๋ด ์์
ํ๋ก์ ํธ์์ proxyquire
๋ฅผ ์ฌ์ฉํ์ฌ ES ๋ชจ๋์ ์ข
์์ฑ์ ์ ๊ฑฐํ์ต๋๋ค.
proxyquire('./mylib.mjs', {doSomething: () => 'done'})
๊ธฐ์ฌ์ ์ด์ ๊ฐ์ ์์ ๊ฐ์๋ Quibble (TestDouble์์ ์ฌ์ฉ)์์๋ ์๋นํ ๋์ผํ์ง๋ง Quibble์ ๋ถ๋ถ ์คํ ์ ์ง์ํ์ง ์์ผ๋ฏ๋ก ์ํํ๋ ์์ ์ด ์ฝ๊ฐ ๋ค๋ฆ ๋๋ค.
await quibble.esm('./mylib.mjs', {doSomething: () => 'done'}, 'yabadabadoing') // not sure what this third param does ...
๋ฐ๋ผ์ ์์ ๋งํ ๋ด์ฉ์ ๋ฐ๋ผ Sinon์ ES ๋ชจ๋ ์กฐ๋กฑ์ ๋ํ ์ง์์ ๋ช ์ ์ ์ผ๋ก ์ถ๊ฐํ์ง ์์ต๋๋ค. Quibble, Proxyquire, Rewire, NormalModuleReplacementPlugin (webpack) ๋ฐ์ด๋ฅผ ์ํํ๋ ๋ค๋ฅธ ๋ชจ๋ ๋ฐฉ๋ฒ (100 % ํ๊ฒฝ)์ ๋งก๊ธฐ๋ ๊ฒ์ด ๋ซ์ต๋๋ค. ๋งค๋ฌ๋ฆฐ.
@ fatso83 ์ ์ด๊ฒ์ด "๋ช ์ ์ ์ผ๋ก ์ง์์ ์ถ๊ฐํ์ง ๋ง์ญ์์ค"๋ผ๊ณ ํ์ ํ๋์ง ๋ฌผ์ ์ ์์ต๋๊น? ํ์ฌ์ ์ผ๋ก ES6 ๋ชจ๋ ์ฝ๋๋ฅผ ์กฐ๋กฑํ๋ ์๋ฃจ์ ์ ์ฐพ๋ ๋์ ๋ง์ง๋ง ๋ ์ ์ฌ๊ธฐ์์ ์ฌ๋ฌ ๋ฒ ์ฝ์์ต๋๋ค.
Jest์ ๋ฌธ์ํ ๋ ์๋ฃจ์ ์ด ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ์์ต๋๋ค. @giltayar์ ๊ธฐ์ฌ๋ฅผ ์ฐพ์ ๋๊น์ง ๊ฑฐ์ ํฌ๊ธฐํ์ต๋๋ค. ๊ทธ๋ฐ ์๋. ๋๋ testdouble.js๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์ ๋๊น์ง quibble๊ณผ ํจ๊ป ์ผํ๋ ๊ฒ์ ์ป์์ต๋๋ค.
์๋ฐ ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ํจํค์ง์ ์์ฒด ๋ฌธ์ ์คํ์ผ์ด ์๊ณ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ค์ API ๋ฌธ์๊ฐ์๋ ๊ฒ์ ์ด๋ฏธ ์ถฉ๋ถํ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ํ๋ ๋ฐฉ์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์กฐ๋กฑํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์กฐ๋กฑํ๊ธฐ์ํ ๋ชจ๋ ๋ก๋๊ฐ ์๋ํ๋ ๋ฐฉ์์ ํ์ ํด์ผํ๋ ๊ฒ์ ๋๋ฌด ๋ง์ ์ผ์ ๋๋ค. .
๋ค๋ฅธ ์ฌ๋๋ค์ด "์ต์ข ์ฌ์ฉ์"ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ํด ํจํค์ง๋ฅผ ํจ๊ป ์ฐ๊ฒฐํ๋ ๋ฐ ์ง์คํ ์์๋ ๋ฐ๋ฉด, Sinon์์๋ ๊ทธ๋๋ก ์ง์คํ๋ค๊ณ ๋งํ๋ ๊ฒฝ์ฐ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ ๋ ์ ์ ๊ฐ์ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ง์ ํ ๊ณ ํต์ด ์๋ค๋ ๊ฒ์ ๋ณด์ฌ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ํ๋ก์ธ์ค๊ฐ ๋จ์ํ๋๋ฉด ํนํ ๋ง์ ์ฌ๋๋ค์ด ๋ค์ ํด์ ES ๋ชจ๋๋ก ์ด๋ํ ๊ฒฝ์ฐ ๋ง์ ์ฌ๋๋ค์ด ๊ธฐ๋ปํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
๊ธฐ์ ์ ์ดํด๊ฐ ๊ทธ๋ ๊ฒ ๊น์ง ์์ต๋๋ค. ์ ๊ฒฝํ์ ๋ํ ํผ๋๋ฐฑ์ด ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
@ fatso83 ์ ์ด๊ฒ์ด "๋ช ์ ์ ์ผ๋ก ์ง์์ ์ถ๊ฐํ์ง ๋ง์ญ์์ค"๋ผ๊ณ ํ์ ํ๋์ง ๋ฌผ์ ์ ์์ต๋๊น?
๋ค์ ๋ฐ๋ณตํ๊ฒ ์ต๋๋ค. ๋ชจ์ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ Sinon์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ณ ์ ๋ฌธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ ์ ์ฒ๋ฆฌ๋๋ค๋ ๊ฒ์ด Sinon ๊ด๋ฆฌ์์ ์๊ฒฌ์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ๋จ์ผ ๋ฐํ์์์ ๋ชจ๋ ๊ฒ์ ์๋ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ ์ด์น์ ๋ง์ง ์์ต๋๋ค. ๊ท๋ชจ๊ฐ ํฌ๊ณ ์๊ธ์ด ์ ์ง์๋๋ ์คํ ์์ค ํ๋ก์ ํธ๋์ด๋ฅผ ์๋ํฉ๋๋ค.
Jest์ ๋ฌธ์ํ ๋ ์๋ฃจ์ ์ด ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ์์ต๋๋ค. @giltayar์ ๊ธฐ์ฌ๋ฅผ ์ฐพ์ ๋๊น์ง ๊ฑฐ์ ํฌ๊ธฐํ์ต๋๋ค. ๊ทธ๋ฐ ์๋. ๋๋ testdouble.js๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์ ๋๊น์ง quibble๊ณผ ํจ๊ป ์ผํ๋ ๊ฒ์ ์ป์์ต๋๋ค.
๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค๋ฅธ ์ ํ์ํฉ๋๋ค.
testdouble.js์ ๊ด๋ฆฌ์๋ ์์ ์ ์ ํ์ํฉ๋๋ค. ๊ทธ๋ค์ quibble์ ์ถํํ๊ณ ๋์๊ด์ ํตํฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๊ทธ๋ค์๊ฒ ์ข์ต๋๋ค. ์๋ฃจ์ ์ด ๋ง์์ ๋ค๋ฉด ๋ฐ๋์ ์ฌ์ฉํ์ญ์์ค. @searls ์
์๋ฐ ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ํจํค์ง์ ์์ฒด ๋ฌธ์ ์คํ์ผ์ด ์๊ณ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ค์ API ๋ฌธ์๊ฐ์๋ ๊ฒ์ ์ด๋ฏธ ์ถฉ๋ถํ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ํ๋ ๋ฐฉ์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์กฐ๋กฑํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์กฐ๋กฑํ๊ธฐ์ํ ๋ชจ๋ ๋ก๋๊ฐ ์๋ํ๋ ๋ฐฉ์์ ํ์ ํด์ผํ๋ ๊ฒ์ ๋๋ฌด ๋ง์ ์ผ์ ๋๋ค. .
๋ค๋ฅธ ์ฌ๋๋ค์ด "์ต์ข ์ฌ์ฉ์"ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ํด ํจํค์ง๋ฅผ ํจ๊ป ์ฐ๊ฒฐํ๋ ๋ฐ ์ง์คํ ์์๋ ๋ฐ๋ฉด, Sinon์์๋ ๊ทธ๋๋ก ์ง์คํ๋ค๊ณ ๋งํ๋ ๊ฒฝ์ฐ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ์ ๋ ์ ์ ๊ฐ์ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ง์ ํ ๊ณ ํต์ด ์๋ค๋ ๊ฒ์ ๋ณด์ฌ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ํ๋ก์ธ์ค๊ฐ ๋จ์ํ๋๋ฉด ํนํ ๋ง์ ์ฌ๋๋ค์ด ๋ค์ ํด์ ES ๋ชจ๋๋ก ์ด๋ํ ๊ฒฝ์ฐ ๋ง์ ์ฌ๋๋ค์ด ๊ธฐ๋ปํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
JavaScript ์ํ๊ณ์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๊ธฐ์๋ ๊ฒ์ ์๋๋๋ค.
10 ๋ ์ด์ ๋์ ๋ค์ํ ๊ด๋ฆฌ์๊ฐ Sinon ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ๊ตฐ์ ๋ฌด๋ฃ๋ก ์ ๊ณตํ์ต๋๋ค. ์ค์ ๋ก ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ง ๊ด๋ฆฌํ๋ ๋ฐ ๋ค์ด๊ฐ ๋ชจ๋ ์์ ์ ๊ด๋ฆฌ์์ ์์ ์๊ฐ์ ๋ฌด๊ธ ์์ ์ผ๋ก ์ํ๋์์ต๋๋ค. ์ฐ๋ฆฌ๋ JavaScript๋ฅผ ์ ๋ฌธ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๊ทํ์ ๋ถ๋ง์ ๊ณต์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ณต์ง๋ก ์ค ์๊ฐ์ด ๋๋ฌด ๋ง์ต๋๋ค.
๊ธฐ์ ์ ์ดํด๊ฐ ๊ทธ๋ ๊ฒ ๊น์ง ์์ต๋๋ค. ์ ๊ฒฝํ์ ๋ํ ํผ๋๋ฐฑ์ด ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์์ ์๊ฒ ์ ๋ง๋ ์๋ฃจ์ ์ ์ฐพ์ ๋๊น์ง ์์กด์ฑ์ ์กฐ๋กฑํ๋ ์ข์ ๊ฐ์ ๋ํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ๊ณ testdouble.js๋ฅผ ์ฌ์ฉํ์ฌ JavaScript๋ฅผ๋ก๋ํ๋ ํน์ ๋ฐฉ๋ฒ์ผ๋ก ํฐ ์ฑ๊ณต์ ๊ฑฐ๋ ๋ฐฉ๋ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
ํํํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ๋ก ํ๋ช
๋๋ฉด sinonjs.org
์์ ํ๋ณด ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
@mroderick ๋๋ ๋จผ์ ๋น์ ๊ณผ Sinon ๊ด๋ฆฌ์๊ฐ ๋์ ์กด๊ฒฝ์ฌ์ ๊ฐ์ง๊ณ ์์์ ๋ถ๋ช ํํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค!
JavaScript ์ํ๊ณ์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๊ธฐ์๋ ๊ฒ์ ์๋๋๋ค.
ํ์คํ ์๋๋๋ค. ๋ค๋ฅธ ์ธ์ด๋ณด๋ค ๋์์ด ๋ ๋ง์ด ํ์ํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ์ํ ๊ฒ์ ๋๋ค.
๋ชจ์ ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ Sinon์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉฐ ์ ๋ฌธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ ์ ๋ค๋ฃจ์ด์ง๋๋ค.
๋ด๊ฐ ๋งํ๋ฏ์ด ์ถฉ๋ถํ ๊ณตํํ๊ฒ, ๋๋ ๊ทธ๊ฒ์ ์ดํดํ ์ ์์ผ๋ฉฐ ์๋ง๋ ๋น์ ์ ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํจ์ผ๋ก์จ ๊ด๋ จ๋ ๋ ธ๋ ฅ์ ๋ํด ํจ์ฌ ๋ ๊น์ด ์ดํดํ๊ณ ์์ ๊ฒ์ ๋๋ค. ๋ํ ๋ก๋ API๋ ์์ง ์คํ์ ์ ๋๋ค.
์ ๋ ํ์ฌ ์๋ํ๋ ๋ฒ์ ์ด ๋ ์ค์๋ง์ ์คํ ์์ค๋ก ์ถ์ ํ ๊ณํ ์ธ ์์ CLI ๋๊ตฌ๋ฅผ ์์
์ค์
๋๋ค. ์ด ์์
์ด ์๋ฃ๋๋ฉด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ๋ ๊ฒ์ ๊ณ ๋ คํฉ๋๋ค. ๋๋ Sinon์ ๋ํด ๋๋ฌด ๋ง์ ์ข์ ๊ฒ์ ์ฝ์ ๊ธฐ ๋๋ฌธ์ ์ ์ proxyquire
Sinon์ ์๋ํด ๋ณผ ๊ฒ์
๋๋ค.
๋๋ Sinon์ ๋ํด ๋๋ฌด ๋ง์ ์ข์ ๊ฒ์ ์ฝ์ ๊ธฐ ๋๋ฌธ์ ์ ์
proxyquire
Sinon์ ์๋ํด ๋ณผ ๊ฒ์ ๋๋ค.
์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ์ด๋๊ฐ ์์ต๋๋ค : https://sinonjs.org/how-to/link-seams-commonjs/
๊ฐ์ด๋๊ฐ ๊ฐ์ ๋ ์ ์๋ค๊ณ ์๊ฐ๋๋ฉด ํ ์์ฒญ์ ๋ณด๋ด์ฃผ์ธ์ ๐
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@giltayar ESM ์ง์ ๊ตฌํ์ ์ถํํฉ๋๋ค! ์ข์ ๊ธฐ์ฌ, btw. ์ฐ๋ฆฌ๋ ํญ์ ESM ๋ฐํ์์ ์ค์ ํ ๋ ES ๋ชจ๋ ์คํฐ ๋น์ด ๊ฐ๋ฅํ์ง ์๋ค๊ณ ๋งํ์ง๋ง, (์์ ๊ฐ์ด) ์ด๊ฒ์ด proxyquire, rewire ๋๋ ... Quibble๊ณผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ ์์ค์์ ์ฒ๋ฆฌ๋์ด์ผํ๋ค๊ณ ๋งํ์ต๋๋ค. ์ง์์ ์ถ๊ฐ ํ ์์น :)
๋ด ์์ ํ๋ก์ ํธ์์
proxyquire
๋ฅผ ์ฌ์ฉํ์ฌ ES ๋ชจ๋์ ์ข ์์ฑ์ ์ ๊ฑฐํ์ต๋๋ค.๊ธฐ์ฌ์ ์ด์ ๊ฐ์ ์์ ๊ฐ์๋ Quibble (TestDouble์์ ์ฌ์ฉ)์์๋ ์๋นํ ๋์ผํ์ง๋ง Quibble์ ๋ถ๋ถ ์คํ ์ ์ง์ํ์ง ์์ผ๋ฏ๋ก ์ํํ๋ ์์ ์ด ์ฝ๊ฐ ๋ค๋ฆ ๋๋ค.
๋ฐ๋ผ์ ์์ ๋งํ ๋ด์ฉ์ ๋ฐ๋ผ Sinon์ ES ๋ชจ๋ ์กฐ๋กฑ์ ๋ํ ์ง์์ ๋ช ์ ์ ์ผ๋ก ์ถ๊ฐํ์ง ์์ต๋๋ค. Quibble, Proxyquire, Rewire, NormalModuleReplacementPlugin (webpack) ๋ฐ์ด๋ฅผ ์ํํ๋ ๋ค๋ฅธ ๋ชจ๋ ๋ฐฉ๋ฒ (100 % ํ๊ฒฝ)์ ๋งก๊ธฐ๋ ๊ฒ์ด ๋ซ์ต๋๋ค. ๋งค๋ฌ๋ฆฐ.