Sinon: ESM ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ์— ๋Œ€ํ•œ ๊ฐ์‹œ ์‹คํŒจ/์„ค๋ช…ํ•  ์ˆ˜ ์—†์„ ์ •๋„๋กœ ์ฐจ๋‹จ๋จ

์— ๋งŒ๋“  2020๋…„ 05์›” 02์ผ  ยท  21์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: sinonjs/sinon

๋ฒ„๊ทธ ์„ค๋ช…
์ด์ „์—๋Š” import * as foo from 'someModule' + spy(foo, 'default') ์ด ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค(์ด ์ €์žฅ์†Œ์˜ ๋ฌธ์ œ์— ์†”๋ฃจ์…˜์œผ๋กœ ๋‚˜์—ด๋˜๊ธฐ๊นŒ์ง€ ํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์ด๊ฒƒ์€ ์ˆ˜๋™ throw์— ์˜ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™
Sinon์€ ๊ธฐ๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ(๋‹ค์Œ ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค):

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „: 9.0.2

์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ
์ด๊ฒƒ์€ TypeError: Cannot assign to read only property ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ old skool __defineGetter__ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

@mroderick ๋Œ“๊ธ€ ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ๋ฌด์‹œํ•˜์„ธ์š”. ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„์›€์ด ๋˜๋Š” ๋Œ“๊ธ€์„ ์ ๊ทน์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์ „ํ˜€ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€์„ ์ œ๊ฑฐํ•˜๋ฉด ๋น„์Šทํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋Œ“๊ธ€์„ ๋‹ฌ๊ณ  ๊ฒฐ๊ตญ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋งค์šฐ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” "๊ตฌ๋… ์ทจ์†Œ" ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์ €๋Š” ์ด ํ”„๋กœ์ ํŠธ์˜ ๊ด€๋ฆฌ์ž์ด๋ฉฐ ๋ชจ๋“  ์˜๊ฒฌ์„ ์ฝ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ์ •ํ•ด์ง„ ๊ทœ์น™์„ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ  ์ œ๊ณต๋œ ์ง€์นจ์„ ๋ฌด์‹œํ•˜๊ณ  ์ž์‹ ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด ์›๋ž˜ ๋ฌธ์ œ๋ฅผ ๊ฐ€๋กœ์ฑ„๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ“๊ธ€์„ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ์ด์Šˆ ๊ตฌ๋…์„ ์ทจ์†Œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ •์ค‘ํ•˜๊ณ  ์žฌ์น˜ ์žˆ๊ณ  ํšจ์œจ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ์€ ์ œ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. ํ•˜์ด์žฌํ‚น ๋ฌธ์ œ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‹น์‹ ๊ณผ ๋‹ค๋ฅธ ์ง€์—ญ ์‚ฌํšŒ๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ์„ธ์š”.

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

์ด ์˜ค๋ž˜๋œ ๋ฌธ์ œ์—๋Š” ์‹ค์ œ๋กœ __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์ด ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰