๋ฒ๊ทธ ์ค๋ช
์ด์ ์๋ import * as foo from 'someModule'
+ spy(foo, 'default')
์ด ์ ์๋ํ์ต๋๋ค(์ด ์ ์ฅ์์ ๋ฌธ์ ์ ์๋ฃจ์
์ผ๋ก ๋์ด๋๊ธฐ๊น์ง ํ์ต๋๋ค). ๊ทธ๋ฌ๋ ์ด์ ์ด๊ฒ์ ์๋ throw์ ์ํด ๋ช
์์ ์ผ๋ก ์ฐจ๋จ๋ฉ๋๋ค.
์์๋๋ ํ๋
Sinon์ ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๊ฐ์ํฉ๋๋ค.
์ปจํ ์คํธ(๋ค์ ์ ๋ณด๋ฅผ ์์ฑํ์ญ์์ค):
์ถ๊ฐ ์ปจํ
์คํธ
์ด๊ฒ์ TypeError: Cannot assign to read only property
๋ฅผ ํผํ๊ธฐ ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ old skool __defineGetter__
์ ์ฌ์ฉํ์ฌ ์ผ์ฃผํ ์ ์์ต๋๋ค.
์ด ์ค๋๋ ๋ฌธ์ ์๋ ์ค์ ๋ก __defineGetter__
์ ๋ํ ์ธ๊ธ์ด ์๊ณ Object.defineProperty๋ง ์์ผ๋ฉฐ ์ค์ ECMAScript ๋ชจ๋์ด ์๋ ๋ณํ๋ Webpack ๋ชจ๋๋ง ์ฒ๋ฆฌํฉ๋๋ค. ์๋ํ์ง ์๋๋ค๋ ๋ง์ ์๋์ง๋ง ๐
๊ฐ์ ธ์จ ES ๋ชจ๋์ (๊ธฐ๋ณธ๊ฐ์ด ์๋) ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๋ฎ์ด์ธ ์ ์๋ ๊ฐ๋จํ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ ์์ ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๊น? ์ด๊ฒ์ ํ
์คํธํ๋ ค๋ฉด some-module.mjs
๋ฐ file-that-overwrites.mjs
๋ ๊ฐ์ ํ์ผ์ด ํ์ํ๋ฉฐ import
๊ตฌ๋ฌธ์ ํ์ฑํํ๋ ค๋ฉด Node์ ๋ํ .mjs
ํ์ฅ์๊ฐ ์์ด์ผ ํฉ๋๋ค.
์ด ํ ์คํธ ์ค์ํธ๋ Sinon์ ํ์ฌ ๋์์ ๋ฌธ์ํํฉ๋๋ค.
์ฐธ๊ณ ๋ก ์ฌ๊ธฐ ์์ [email protected]+ ์์๋ FYI ์คํ ์ด ์๋ํ์ง ์์ต๋๋ค.
@fatso83 ๊ทธ ์ค๋๋ ๋ฌธ์ ๋ ์ค์ ๋ก ๊ทธ๋ ์ง ์์ต๋๋ค(ํ์ง๋ง ๐๋ผ๊ณ ๋งํ์ง๋ ์์์ต๋๋ค).
๋ด๊ฐ ์๋ฏธํ๋ ๊ฒ์ ESM์ ๊ฒ์ถ ํ ๋ Sinon ๋๋ฌธ์ ๋์ค์ ์ฝ๋ ์๋์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค Object.defineProperty(object, property, methodDesc)
์คํจํฉ๋๋ค TypeError: Cannot assign to read only property 'default'
. ๊ทธ๋ฌ๋ __defineGetter__
๋ ์คํจํ์ง ์์ต๋๋ค.
object.__defineGetter__(property, methodDesc.value);
Buuuut, Sinon ์ฝ๋๋ฅผ ์์ ํ๊ณ ์คํํ๋ ค๊ณ ํ์ ๋ __defineGetter__
์์ ์ ์๋์ง ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค(์๋ง๋ ์๊ฒฉ ๋ชจ๋ ๋๋ ๊ธฐํ?).
๋ฐ๋ผ์ ์์ฑ์ ์ฌ์ ์ํ๋ ๋์ ๊ฐ์ฒด๋ฅผ ๋ค์ ์์ฑ(์ ๊ฐ์ผ๋ก)ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ ์์ต๋๋ค. ๋ ๋ณต์กํ์ง๋ง ์ ์ด๋ ํ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ์ฌ๊ธฐ ์์ [email protected]+ ์์๋ FYI ์คํ ์ด ์๋ํ์ง ์์ต๋๋ค.
๋ง์ง๋ง ์์ ๋ฒ์ 3.8.3์์ ๋์ผํ ๋ฌธ์
@zorji ๋ฐ @aelbore : ์ ์ด ์ค๋ ๋์ ๊ฒ์ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ก์ด ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํ๋ ๊ฒฝ์ฐ ๋ณ๋์ ๋ฌธ์ ๋ฅผ ๋ง๋ค๊ณ ๋ณด๊ณ ๋ฅผ ์ํ ์ผ๋ฐ์ ์ธ ๋จ๊ณ(ํ์ธ ๋ฐฉ๋ฒ, ์ค์ ์ฝ๋, ๋ฒ์ ๋ฑ)๋ฅผ ๋ฐ๋ฅด์ธ์. ์ฐ๋ฆฌ๋ Typescript๋ฅผ ์ง์ํ์ง ์์ผ๋ฉฐ ๊ทธ๋ ๊ฒ ๋งํ ์ ์ด ์์ต๋๋ค. ๋ฌผ๋ก ์๋ํด์ผ ํ์ง๋ง ์์ธํ ๋ด์ฉ์ ๋ณํ ๋จ๊ณ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๋ฐ๋ผ์ ์์ฑ์ ์ฌ์ ์ํ๋ ๋์ ๊ฐ์ฒด๋ฅผ ๋ค์ ์์ฑ(์ ๊ฐ์ผ๋ก)ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ณ ์์ต๋๋ค. ๋ ๋ณต์กํ์ง๋ง ์ ์ด๋ ํ ์ ์์ต๋๋ค.
๊ทธ๋ ์ต๋๊น? ES ๋ชจ๋์ ๋ฐํ์ AFAIK์ ๋ฐ์ธ๋ฉ๋ ์ ์ ๊ธฐ๋ฅ์ด๋ฉฐ ์์ ํ ์ ์์ต๋๋ค.
๊ฐ์ ธ์จ ๊ธฐ๋ฅ์ ํ์ผ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ด๋ณด๋ธ ๊ธฐ๋ฅ์ ์ฝ๊ธฐ ์ ์ฉ ๋ณด๊ธฐ์ ๋๋ค. ๊ฐ์ ธ์จ ๋ณ์๋ ๋ณ๊ฒฝํ ์ ์์ง๋ง const์ ์ ์ฌํ ์์ฑ์ ๊ณ์ ์์ ํ ์ ์์ต๋๋ค. ๋ํ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ผ์ด๋ธ ๋ฐ์ธ๋ฉ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ const์ ๋ฌ๋ฆฌ ๋ฐ์ธ๋ฉ์ ์์ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules
๋น์ ์ด ์ด๊ฒ์ผ๋ก ์๋ฌด๋ฐ๋ ๊ฐ ์ ์๋์ง ๊ธฐ๋ํ๊ณ ์์ง๋ง ๋น์ (๋๋ ๋๊ตฐ๊ฐ!)์ด ๊ทธ๋ฌ๋ค๋ฉด ๋๋ ๋๋ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ๋ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ค๋๋ ๊ฒ์ผ๋ก ํ์๋์์ต๋๋ค. ๋ ์ด์ ํ๋์ด ์์ผ๋ฉด ํ์๋ฉ๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋์ ๋ด. ์ด ์ด๋ฆฌ์์ ์ผ์ ๋ ์ ์์ต๋๊น?
@OmgImAlexis ์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ์ด์ด๋ ์ด์ ๊ฐ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?
์ฌ๋ฌ๋ถ, ๋ฌธ์ ๋ฅผ ์์ ์ผ๋ก ์ ์งํ๊ณ ์๋ ๊ฒ์๋ฌผ์ ์ธ๊ธ๋ ๋ด์ฉ๋ง ๋ ผ์ํ์ญ์์ค.
์ ์ง ๊ด๋ฆฌ์๊ฐ ๋์ผํ ๋ฌธ์ ์์ ์ง๊ตํ๋ ์ฃผ์ ๋ฅผ ํ์ํ์ง ์๊ณ ๋ ๋ฌด๋ฃ ์ํํธ์จ์ด๋ฅผ ์ง์ํ๋ ๋ฌด๊ธ ์์ ์๊ฐ์ ๋ณด๋ด๋ ๊ฒ์ ์ถฉ๋ถํ ์ด๋ ค์ด ์ผ์ ๋๋ค.
์ฐ๋ฆฌ๋ Sinon(JavaScript ๋๊ตฌ)์ด TypeScript ์ปค๋ฎค๋ํฐ์์๋ ์ ์ฉํ ์ ์๋ค๋ ์ฌ์ค์ ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค. ํ์ง๋ง @fatso83์ด ๋งํ๋ฏ์ด ์ฐ๋ฆฌ๋ Typescript๋ฅผ ์ง์ํ์ง ์์ต๋๋ค .
์ด๋ฒ ํธ์์ TypeScript์ ๋ํ ์ฃผ์ ๋ฅผ ๋ฒ์ด๋ ์ถ๊ฐ ๋๊ธ์ ์ญ์ ๋ฉ๋๋ค.
์ด๋ฒ ํธ์์ TypeScript์ ๋ํ ์ฃผ์ ๋ฅผ ๋ฒ์ด๋ ์ถ๊ฐ ๋๊ธ์ ์ญ์ ๋ฉ๋๋ค.
@mroderick ๋๊ธ ์ด ๋ง์์ ๋ค์ง ์์ผ๋ฉด ๋ฌด์ํ์ธ์. ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ๋์์ด ๋๋ ๋๊ธ์ ์ ๊ทน์ ์ผ๋ก ์ ๊ฑฐํ๋ ๊ฒ์ ์ ํ ๋์์ด ๋์ง ์์ต๋๋ค. ๋๊ธ์ ์ ๊ฑฐํ๋ฉด ๋น์ทํ ์ฌ์ฉ์๊ฐ ๊ณ์ํด์ ๋๊ธ์ ๋ฌ๊ณ ๊ฒฐ๊ตญ ์ค๋ ๋๊ฐ ์ ๊ธฐ๊ฒ ๋ฉ๋๋ค.
ํธ์ง: ๋งค์ฐ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ "๊ตฌ๋ ์ทจ์" ๋ฒํผ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. :)
์ฃ์กํฉ๋๋ค, ์ ๋ ์ผ์ ๋งค์ฐ ๋ฐ๋นด์ต๋๋ค. ๋ช ์ฃผ ํ์ ์ดํด๋ณด๋ ค๊ณ ํฉ๋๋ค. ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ฅผ ์ํํ๋ฏ๋ก ๊ฐ๋ฅํด์ผ ํฉ๋๋ค ๐
@mroderick ๋๊ธ ์ด ๋ง์์ ๋ค์ง ์์ผ๋ฉด ๋ฌด์ํ์ธ์. ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ๋์์ด ๋๋ ๋๊ธ์ ์ ๊ทน์ ์ผ๋ก ์ ๊ฑฐํ๋ ๊ฒ์ ์ ํ ๋์์ด ๋์ง ์์ต๋๋ค. ๋๊ธ์ ์ ๊ฑฐํ๋ฉด ๋น์ทํ ์ฌ์ฉ์๊ฐ ๊ณ์ํด์ ๋๊ธ์ ๋ฌ๊ณ ๊ฒฐ๊ตญ ์ค๋ ๋๊ฐ ์ ๊ธฐ๊ฒ ๋ฉ๋๋ค.
ํธ์ง: ๋งค์ฐ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ "๊ตฌ๋ ์ทจ์" ๋ฒํผ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. :)
์ ๋ ์ด ํ๋ก์ ํธ์ ๊ด๋ฆฌ์์ด๋ฉฐ ๋ชจ๋ ์๊ฒฌ์ ์ฝ์ผ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค.
์ฌ๋๋ค์ด ์ ํด์ง ๊ท์น์ ๋ฐ๋ฅด์ง ์๊ณ ์ ๊ณต๋ ์ง์นจ์ ๋ฌด์ํ๊ณ ์์ ์ ๋ชฉ์ ์ ์ํด ์๋ ๋ฌธ์ ๋ฅผ ๊ฐ๋ก์ฑ๊ธฐ๋ก ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋๊ธ์ ๋ฌด์ํ๊ฑฐ๋ ์ด์ ๊ตฌ๋ ์ ์ทจ์ํ ์ ์์ต๋๋ค. ์ ์คํ๊ณ ์ฌ์น ์๊ณ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๊ฒ์ ์ ์ฑ ์์ ๋๋ค. ํ์ด์ฌํน ๋ฌธ์ ๋ ์ปค๋ฎค๋ํฐ๋ฅผ ์ง์ํ๋ ๊ฒ๋ณด๋ค ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
๋น์ ๊ณผ ๋ค๋ฅธ ์ง์ญ ์ฌํ๋ฅผ ๋์ธ ์ ์๋๋ก ๋์์ฃผ์ธ์.
์ด ๋ฌธ์ ๋ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ค๋๋ ๊ฒ์ผ๋ก ํ์๋์์ต๋๋ค. ๋ ์ด์ ํ๋์ด ์์ผ๋ฉด ํ์๋ฉ๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋์ ๋ด.
@jshado1 ์ด ๋ฌธ์ ๊ฐ ๊ณ์ ์ด๋ ค ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?
@jshado1 ์ ์ด๊ฒ์ด ์ ์๋ํ๋ค๊ณ ๋งํ์ง๋ง ์ด๊ฒ์ด ๋ฐ๋๋ผ ๋ณํ๋์ง ์์ ์๋ฐ ์คํฌ๋ฆฝํธ์์ ์๋ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํด์๋ ์ ๋๊ธฐ ๋๋ฌธ์
๋๋ค. Babel/Webpack ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ํธ๋์คํ์ผํ ๋ ์๋ํ ์ ์์ต๋๋ค. ๋ชจ๋๋ง ์๋ฎฌ๋ ์ดํธํ๊ณ ๋ฐํ์์์ ์ฝ๊ธฐ ์ ์ฉ ๊ฐ์ฒด(๋ชจ๋์ด ๋ฌด์์ธ์ง)๋ฅผ ์ค์ ๋ก ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. throw ์ ์ ๋ด๊ฐ ์ถ๊ฐํ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ _๊ทธ๋ ์ง ์์ผ๋ฉด ๋์ง ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋น์ ์ด ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ ๋ณ๊ฒฝํ๋ ค๊ณ ํ ๋ ์กฐ๊ธ ํ์. ๊ทธ๋ฌ๋ esm
์ ๊ฐ์ ๋ฐํ์/๋ชจ๋ ๋ก๋๋ ํ๋๋ฅผ ์ฝ๊ฐ ๋ณ๊ฒฝํฉ๋๋ค.
๋์์ด ์๋ชป๋์๋ค๊ณ ์๊ฐ๋๋ฉด node_modules/sinon/lib/sinon/spy.js
ํธ์งํ๊ณ throws ์ ์ ์ ๊ฑฐํ๊ณ ๋ค์ ๋ณด๊ณ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ๊ฐ ์์. ์ฝ์ :์ ๋์ฝ: :๋ฌด์ง๊ฐ:
@RyanCavanaugh ์ธ์ฉ (https://github.com/microsoft/TypeScript/issues/38568#issuecomment-628860591)
commonjs
ํ์ง๋ง ES ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ/๋ด๋ณด๋ด๊ธฐ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ TS๋ ์ฌ์ ํ ES ๋ชจ๋ ๋์์ ์ ๊ณตํ๋ ค๊ณ ํฉ๋๋ค.์ด ์ฝ๋๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ(
import * as name
์ผ๋ก ๊ฐ์ ธ์จ ์์ฑ์ ๋ณ๊ฒฝํ ์ ์์)์ ์์ ํ๋ ค๊ณ (sinon.stub
๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก) ์๋ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ ํฉ๋ฒ์ ์ธ ES๊ฐ ์๋๋๋ค. ์๋ํ์ง ๋ง์์ด์ผ ํ์ต๋๋ค.
์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๊ฐ ๋งํ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ด ๊ฒฐ๊ณผ๋ ํธ๋์คํ์ผ ๋จ๊ณ, ํธ๋์คํ์ผ๋ฌ๊ฐ ํด๋น ๋จ๊ณ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ ๋ฑ์ ์ ์ ์ผ๋ก ์์กดํ๋ฏ๋ก ESM ์ฌ์์ ์ด๋ ์ ๋ ์ผ์นํ๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋ฉด _์๋ํ์ง ์์์ผ ํฉ๋๋ค_ ES ๋ชจ๋์ ๋ด๋ณด๋ด๊ธฐ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค(๋ฌผ๋ก ํด๋น ๋ด๋ณด๋ด๊ธฐ์ ์ํด ๋ฐ์ธ๋ฉ๋ ์ค์ ๊ฐ์ฒด๋ ์๋).
@mroderick @fatso83 ๊ทธ๋์ ์ฌ๋ ์๊ฐ์ด ์์๊ณ ๊ทธ ์ดํ๋ก ์ง์ฅ์์ https://github.com/nodejs/node/blob/master/doc/api/esm .md#๋ก๋
์ด๊ฒ๋ค์ ํ์ฌ ๋ถ์์ ํ๋ฏ๋ก(๊ณง ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ผ๊ณ ๋ช ์์ ์ผ๋ก ์ธ๊ธ๋จ), ์๋ง๋ ๋ ์์ ๋ ๋๊น์ง ๋ณด๋ฅํ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ผ๋จ ๊ทธ๋ ๊ฒ ํ๋ฉด ๊ฐ์ผ ํ ๊ธธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ฐ์ดํธ: ์ด๊ฒ์ ํ์ฌ nodejs/node#36396์์ ๋ ผ์ ์ค์ ๋๋ค.
์ด ์๊ฒฌ์ ์๋ ๋ด ์ ์์ด ์ด๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉ์๋ ์๋์ผ๋ก ์ง๋๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฉฐ esm ๋ก๋๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์ ๋์ฒดํ ์ ์์ต๋๋ค.
// const mocksMap = { 'serviceA.js': 'serviceA.mock.js' };
const mock = mocksMap[importPath]; // note: it's not called `importPath` in the loader hooks
if (mock) // โฆ
๋ฐ/๋๋ esm ๋ก๋๋ ํ์ผ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ์ ์ผ์น๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค(๋น ๋ฅธ n ๋ํฐ ์์ ).
const ext = path.ext(importPath);
const filename = path.basename(importPath, ext);
const mockFile = await import(`${filename}.mock${ext}`);
if (mockFile) // โฆ
@jshado1 ํด๋น ๋งํฌ๋ฅผ ์ ๊ณตํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฐ๊ฒฐ๋ ๋ฌธ์ ๋ ๋ณธ์ง์ ์ผ๋ก _link ๋ ๋ฒจ_์์ ์ข ์์ฑ์ ๋์ฒดํ๋ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ผ๋ ค๊ณ ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ rewire ๋ฐ proxyquire์ ๊ฐ์ ๋๊ตฌ๊ฐ ํ๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค(์ด ๋ฐฉ๋ฒ์ ํ ํ์ด์ง์์ ์ค๋ช ํจ ). . ์ด์จ๋ ์ด๊ฒ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ณ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์ ์ผ๋ก ์ฌ์ฉ์ ํ๊ฒฝ์ ๋ฌ๋ ค ์๊ธฐ ๋๋ฌธ์ Sinon์ด ํด๊ฒฐํด์ผ ํ๊ฑฐ๋ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ๋ ์ด ํ๋ก์ ํธ์ ๊ด๋ฆฌ์์ด๋ฉฐ ๋ชจ๋ ์๊ฒฌ์ ์ฝ์ผ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค.
์ฌ๋๋ค์ด ์ ํด์ง ๊ท์น์ ๋ฐ๋ฅด์ง ์๊ณ ์ ๊ณต๋ ์ง์นจ์ ๋ฌด์ํ๊ณ ์์ ์ ๋ชฉ์ ์ ์ํด ์๋ ๋ฌธ์ ๋ฅผ ๊ฐ๋ก์ฑ๊ธฐ๋ก ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋๊ธ์ ๋ฌด์ํ๊ฑฐ๋ ์ด์ ๊ตฌ๋ ์ ์ทจ์ํ ์ ์์ต๋๋ค. ์ ์คํ๊ณ ์ฌ์น ์๊ณ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๊ฒ์ ์ ์ฑ ์์ ๋๋ค. ํ์ด์ฌํน ๋ฌธ์ ๋ ์ปค๋ฎค๋ํฐ๋ฅผ ์ง์ํ๋ ๊ฒ๋ณด๋ค ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
๋น์ ๊ณผ ๋ค๋ฅธ ์ง์ญ ์ฌํ๋ฅผ ๋์ธ ์ ์๋๋ก ๋์์ฃผ์ธ์.