Jsdom: jest : SecurityError: localStorage๋Š” ๋ถˆํˆฌ๋ช…ํ•œ ์ถœ์ฒ˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 07์›” 27์ผ  ยท  80์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jsdom/jsdom

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ jest ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ. ํŒจํ‚ค์ง€๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€์—๋Š” localStorage๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

 SecurityError: localStorage is not available for opaque origins

      at Window.get localStorage [as localStorage] (node_modules/jsdom/lib/jsdom/browser/Window.js:257:15)
          at Array.forEach (<anonymous>)


working as intended

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

@gokulkrishh http://localhost/ ํ–ˆ์ง€๋งŒ ์œ ํšจํ•œ URL์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์•„๋ž˜ ๋…ผ์˜ ์š”์•ฝ:

  • ์ˆ˜์ • ์‚ฌํ•ญ์€ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋Š” jsdom์— ๋Œ€ํ•œ URL์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. " about:blank "์˜ ๊ธฐ๋ณธ URL์€ localStorage์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ๊ทผ๋ณธ ์›์ธ์€ ์ข…์ข… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋“  jsdom ์†์„ฑ์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์ „์—ญ ์†์„ฑ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—์„œ localStorage๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ "์‚ฌ์šฉ"ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ˜๋ณต ๋ฐ ๋ณต์‚ฌ ๊ธฐ์ˆ ์€ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ถ€ ๋ฆด๋ฆฌ์Šค์—์„œ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด "๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€"์ธ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์•„๋ž˜ ์ฝ”๋ฉ˜ํŠธ์˜ ์ „์‚ฌ์ž…๋‹ˆ๋‹ค. ์ด ์งˆ๋ฌธ์€ ์ดํ›„ GitHub์˜ "๋” ๋งŽ์€ ์ฝ”๋ฉ˜ํŠธ ๋ณด๊ธฐ" ๊ธฐ๋Šฅ์œผ๋กœ ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๊ทธ๊ฒƒ์ด ์ตœ์„ ์˜ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์›น ํ”Œ๋žซํผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ jsdom์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋งˆ์ด๋„ˆ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

์ข…์† ํ•ญ๋ชฉ, ์‹ฌ์ง€์–ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ข…์† ํ•ญ๋ชฉ๋„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ถˆํ–‰ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…์† ํ•ญ๋ชฉ์ด ์กด์žฌํ•˜๋”๋ผ๋„ jsdom์ด ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜์›ํžˆ ํฌ๊ธฐํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋ฐ ๋ชจ๋‘ ๋™์˜ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์˜ ์ƒํ™ฉ์€ ๊ทธ๋ ‡๊ฒŒ ๊ณผ๊ฒฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋น„์Šทํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” Jest ์ฝ”๋“œ๋ฅผ ์ถ”์ ํ•˜๋Š” ์‚ฌ๋žŒ์„ ์•„์ง ๋ณธ ์ ์ด ์—†์œผ๋ฏ€๋กœ ์ •ํ™•ํžˆ ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ ์ •์ƒ์ ์ธ jsdom ๊ฐœ๋ฐœ ๊ณผ์ •์— ์˜ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ค‘๋‹จ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์›น์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. localStorage๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €.

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

์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ OP์— ๋Œ€ํ•œ ์›๋ž˜ ์‘๋‹ต:

ํ…Œ์ŠคํŠธ์—์„œ URL์„ ์„ค์ •ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์•„๋งˆ๋„ Jest๊ฐ€ window.localStorage ์•ก์„ธ์Šคํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Jest ์œ ์ง€ ๊ด€๋ฆฌ์ž๋Š” ์ตœ์ƒ์˜ ์ˆ˜์ • ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•Œ๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ Jest ํ…Œ์ŠคํŠธ์—์„œ URL์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ 11.12.0 ์™€ ํ•จ๊ป˜ ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋งค์šฐ ์ตœ๊ทผ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. jest ์™€ ํ•จ๊ป˜ enzyme jest ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ์ด์™€ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, 11.11.0 ์—์„œ 11.12.0 ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. jest ๊ตฌ์„ฑ์—์„œ testURL ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

@ben-mckernan ์•ˆ๋…•ํ•˜์„ธ์š”, ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณตํ•œ URL์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ ??

@gokulkrishh http://localhost/ ํ–ˆ์ง€๋งŒ ์œ ํšจํ•œ URL์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Enzyme์€ jsdom ๋ฌธ์„œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํ•˜์ง€ ๋ง๋ผ๊ณ  ๊ฒฝ๊ณ ํ•˜๋Š” ์ผ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์•„๋งˆ๋„ Enzyme์— ํŠน์ •ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋ถ€ ๋ฆด๋ฆฌ์Šค์—์„œ ๊ณ ์žฅ๋‚œ ๊ฒƒ์€ ๊ทธ๋ฆฌ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ๋„ ํŒŒ์‚ฐํ–ˆ์Šต๋‹ˆ๋‹ค :(

@ben-mckernan ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘

๋˜ํ•œ ์ด๊ฒƒ์„ ๊ฒฝํ—˜ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/jsdom/jsdom/blob/23d67ebec901b3471b84e63f58a96b51a36f3671/lib/jsdom/browser/Window.js#L255

("+1" ๋Œ“๊ธ€์€ ์ŠคํŒธ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์‚ฌ๊ณผ. ๊ทธ๋ƒฅ ๋„์™€์ฃผ๋ ค๊ณ  ํ•ด์š”.

@ben-mckernan์ด ์ œ์•ˆํ•œ ๋Œ€๋กœ jestConfig์— testURL ์ถ”๊ฐ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ง๊ด€์„ ํ™•์ธํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค๋ฉด Enzyme๋„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ž ์•ฑ ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ์—๋„ ์ž‘๋™ํ•˜๋Š” "file:/"๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

@miamollie @ben-mckernan ์ œ์•ˆ์— ๋”ฐ๋ผ testURL ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค(Jest + Enzyme ์‚ฌ์šฉ, ๊ด€๋ จ ํšจ์†Œ๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ. jsdom์„ ์‚ฌ์šฉํ•˜๋Š” jest-environment-jsdom ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜). ๊ทธ๋กœ ์ธํ•ด ๋‚ด ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ. ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์„ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ท€ํ•˜์˜ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€๋Š” ๋‚˜์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(TestURL์ด ๊ท€ํ•˜์—๊ฒŒ ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Œ).

@domenic ์ €๋Š”

@gokulkrishh ์˜ˆ, ๋™์ผํ•ฉ๋‹ˆ๋‹ค. localStorage ๋ณด์•ˆ ์˜ค๋ฅ˜๋Š” ์ค‘์ง€๋˜์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ๋Š” ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

@ben-mckernan ์†”๋ฃจ์…˜์ด ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

@ben-mckernan ๊ฐ๋„ ์„ค์ •(jest-preset-angular ํฌํ•จ), ๋™์ผํ•œ ๋ฒ„๊ทธ, ๋™์ผํ•œ ์†”๋ฃจ์…˜์—์„œ jest๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํšจ์†Œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

Jest๊ฐ€ ์ด๋ฅผ ์™„ํ™”ํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ๊ฐ’ testURL ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(ํ˜„์žฌ about:blank ).

@DcsMarcRemolt ๋ฐฉ๊ธˆ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Jest ๋Š” package.json --> "jsdom": "^11.5.1" caret(^) ์—์„œ jest-environment-jsdom ๋ผ๋Š” ์ข…์†์„ฑ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด npm์ด jsdom์„ 11.12.0 ๋กœ ์„ค์น˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (์˜ค๋Š˜ ๊ฒŒ์‹œ๋œ ์ƒˆ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณ ์žฅ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋ฏธ ๋†๋‹ด์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ๋งํฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์กฐ์‹ฌํ•ด.

๋” ๋งŽ์€ ๊ฐ€์‹œ์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ Domenic ์˜ ์ฒซ ๋ฒˆ์งธ ์˜๊ฒฌ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

package.json์˜ jest ๊ตฌ์„ฑ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
"testEnvironment": "node"
๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์‹  @blu3printchris ์—๊ฒŒ

์ด ์—…๋ฐ์ดํŠธ ์ดํ›„๋กœ localStorage์—์„œ JSDOM ๊ตฌํ˜„์„ ๋” ์ด์ƒ ๋ฎ์–ด์“ฐ๊ฑฐ๋‚˜ ์กฐ๋กฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜๋„ํ•˜์ง€ ์•Š์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ƒ์˜ ํ”ผํ•ด ์ œ์–ด ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.
  • ์˜ˆ์ƒ ๋™์ž‘์„ ๋ณต์›ํ•˜๊ธฐ ์œ„ํ•ด ๋˜๋Œ๋ฆฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋œ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „ 11.12.1 ์ž…๋‹ˆ๋‹ค.
  • ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ 11.12.0 ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ƒˆ ๋™์ž‘์„ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์›ํ•˜๋Š” ๊ฒฝ์šฐ 12.0.0 ๋ฅผ ํ•ด์ œํ•˜์—ฌ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๊ทธ๊ฒƒ์ด ์ตœ์„ ์˜ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์›น ํ”Œ๋žซํผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ jsdom์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋งˆ์ด๋„ˆ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

์ข…์† ํ•ญ๋ชฉ, ์‹ฌ์ง€์–ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ข…์† ํ•ญ๋ชฉ๋„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐ์ง€ํ•˜๊ณ  ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ถˆํ–‰ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…์† ํ•ญ๋ชฉ์ด ์กด์žฌํ•˜๋”๋ผ๋„ jsdom์ด ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜์›ํžˆ ํฌ๊ธฐํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋ฐ ๋ชจ๋‘ ๋™์˜ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์˜ ์ƒํ™ฉ์€ ๊ทธ๋ ‡๊ฒŒ ๊ณผ๊ฒฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋น„์Šทํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” Jest ์ฝ”๋“œ๋ฅผ ์ถ”์ ํ•˜๋Š” ์‚ฌ๋žŒ์„ ์•„์ง ๋ณธ ์ ์ด ์—†์œผ๋ฏ€๋กœ ์ •ํ™•ํžˆ ๋งํ•˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ ์ •์ƒ์ ์ธ jsdom ๊ฐœ๋ฐœ ๊ณผ์ •์— ์˜ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ค‘๋‹จ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์›น์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. localStorage๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €.

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

๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ jsdom์„ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ๊ธฐ์ˆ ์ ์œผ๋กœ semver ์œ„๋ฐ˜์ด ์•„๋‹ˆ๋ฉฐ jest๊ฐ€ ํŒจ์น˜๋ฅผ ์ถœ์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  jsdom ์†์„ฑ์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์ „์—ญ ์†์„ฑ์— ์ถ”๊ฐ€ํ•  ๋•Œ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


์ฝ”๋“œ

const { JSDOM } = require('jsdom');
const Node = require('jsdom/lib/jsdom/living/node-document-position');

// We can use jsdom-global at some point if maintaining these lists is a burden.
const whitelist = ['HTMLElement', 'Performance'];
const blacklist = ['sessionStorage', 'localStorage'];

function createDOM() {
  const dom = new JSDOM('', { pretendToBeVisual: true });
  global.window = dom.window;
  global.Node = Node;
  global.document = dom.window.document;
  // Not yet supported: https://github.com/jsdom/jsdom/issues/317
  global.document.createRange = () => ({
    setStart: () => {},
    setEnd: () => {},
    commonAncestorContainer: {
      nodeName: 'BODY',
      ownerDocument: document,
    },
  });
  global.navigator = {
    userAgent: 'node.js',
  };

  Object.keys(dom.window)
    .filter(key => !blacklist.includes(key))
    .concat(whitelist)
    .forEach(key => {
      if (typeof global[key] === 'undefined') {
        global[key] = dom.window[key];
      }
    });
}

module.exports = createDOM;


๋…ธ๋“œ ์ „์—ญ์— jsdom ์ „์—ญ์„ ์ฑ„์šฐ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๊ธ€์Ž„, ๋‚˜๋Š” ์ง€๊ธˆ์€ ํŒจ์Šค. jsdom๊ณผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ฉฐ ์ˆ˜๋…„ ๋™์•ˆ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ๋Œ€์•ˆ์—์„œ ๋™์ผํ•œ ๊ฐ€๋Šฅ์„ฑ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
jsdom-global์„ ์‚ฌ์šฉํ•˜๋Š”

๊ธ€์Ž„, ๋‚˜๋Š” ์ง€๊ธˆ์€ ํŒจ์Šค. jsdom๊ณผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๊ฐ€ "์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €" ๋‚ด์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด jsdom์—์„œ๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ HTML์„ ์ œ๊ณตํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์ „์—ญ์— ํ• ๋‹นํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋น„ํ•ด ๋ณต์žก์„ฑ๊ณผ ์ฐจ์ด์ ์ด ์ถ”๊ฐ€๋กœ ๋„์ž…๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ jsdom ์„ 11.12.0 ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ Jest๊ฐ€ ์•„๋‹Œ Mocha์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฒ˜์Œ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋„์ž…๋œ ์ด์œ ๋ฅผ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹จ์ˆœํžˆ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

const fib = require('./index');

test('Fib function is defined', () => {
  expect(typeof fib).toEqual('function');
});

test('calculates correct fib value for 1', () => {
  expect(fib(1)).toEqual(1);
});

screenshot 2018-07-30 21 10 39

๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” Redux ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์œผ๋กœ React์—์„œ ํฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ ์‹ค์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

//index.js, yes, only one line, no react no redux no enzyme 
function add(a, b) {}

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , testURL ๋ฐ testEnvironment "hack"์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด package.json์ž…๋‹ˆ๋‹ค.

    "jest": {
        "testURL": "http://localhost/",
        "testEnvironment": "node"
    },

๊ทธ๋ž˜์„œ ๋‚ด ์งˆ๋ฌธ์€ ์™œ ์šฐ๋ฆฌ๋Š” ๋‹จ์ง€ "์ž‘๋™"ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ๋ฅผ ์›ํ•˜๋ฉด์„œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž…ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋Š”์ง€์ž…๋‹ˆ๋‹ค.

@khmy2010 ๊ท€ํ•˜์˜ ์ฝ”๋“œ์™€ ์งˆ๋ฌธ์—๋Š” jsdom๋ณด๋‹ค Jest๊ฐ€ ๋” ๋งŽ์ด ๊ด€๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ €์žฅ์†Œ์— ๋ฌธ์ œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

op ๋ฐ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค๊ณผ ๋™์ผํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(์ œ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์ œ์™ธ
ํšจ์†Œ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ์ด ์—†์œผ๋ฉด ๋†๋‹ด์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์— ๋Œ€ํ•œ ๊ฑด ์œ ๊ฐ์ด์•ผ
์ €๊ฒƒ.

2018๋…„ 7์›” 30์ผ 21์‹œ 32๋ถ„์— "Zirro" [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

@khmy2010 https://github.com/khmy2010 ๊ท€ํ•˜์˜ ์ฝ”๋“œ์™€ ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋“ค์ด jsdom์„ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋†๋‹ด์„ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๋“ค์˜
๋Œ€์‹  https://github.com/facebook/jest ์ €์žฅ์†Œ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/jsdom/jsdom/issues/2304#issuecomment-408864079 ๋˜๋Š” ์Œ์†Œ๊ฑฐ
์Šค๋ ˆ๋“œ
https://github.com/notifications/unsubscribe-auth/AVrB3uOLy7l4JKbStKWPtGi0oHfAaQbYks5uLwrpgaJpZM4Vi8gP
.

jsdom ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •์˜ URL์„ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const url = 'http://localhost';
const jsdom = new JSDOM('<!doctype html><html><body></body></html>, { url });

Enzyme + Mocha @srodrigo๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๊ธฐ์กด ์ธํ”„๋ผ๋ฅผ ๋ฌด๋„ˆ๋œจ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ถ€ ๋ฆด๋ฆฌ์Šค 11.12.0์ด ์•„๋‹ˆ๋ผ ์ฃผ ๋ฆด๋ฆฌ์Šค 12.0.0์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€ ๋ฆด๋ฆฌ์Šค๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Domenic ์€ ์ด ์ฃผ์„์—์„œ (๋งํฌ๋ฅผ ํด๋ฆญํ•  ๋•Œ ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ์œ„๋กœ ์Šคํฌ๋กคํ•˜์—ฌ ์ˆจ๊ฒจ์ง„ ์ฃผ์„์„ ๋กœ๋“œํ•จ) ์ด๊ฒƒ์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜๋…„ ๋™์•ˆ ๊ถŒ์žฅํ•˜์ง€ ์•Š์•˜๋˜ ์ผ ์„ ํ•˜๋Š” ์ข…์† ํŒจํ‚ค์ง€์˜ ์ฝ”๋“œ๋Š” ๊ณง ์œ ์ง€ ๊ด€๋ฆฌ์ž์— ์˜ํ•ด ์ˆ˜์ •๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์˜ ์ˆ˜์ • ์‚ฌํ•ญ์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์Œ์„ ํ…Œ์ŠคํŠธ ๊ตฌ์„ฑ์˜ ๋ฃจํŠธ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. --env=jsdom

๋‚ด jest.config.js์— ๋‹ค์Œ ์ถ”๊ฐ€

testURL: 'http://localhost',

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

(Jest ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.) Jest์˜ ๊ด€์ ์—์„œ ๊ธฐ๋ณธ about:blank ์—์„œ ์˜ˆ๋ฅผ ๋“ค์–ด localhost ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋‚ด ์˜๊ฒฌ์„ ๋งํ•  ๋งŒํผ ๋˜‘๋˜‘ํ•œ์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐœ๋ฐœ์ž์˜ ๊ด€์ ์—์„œ localhost๊ฐ€ ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. about:blank ๋Š” ๊ฒฐ์ฝ” ํ˜„์‹ค์ด ์•„๋‹Œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. about:blank url์ด ๊ฑฐ์˜ ์—†๋Š” ์•ฑ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

Jest ํŒ€์€ testURL ๋Œ€ํ•œ ๋” ์Šค๋งˆํŠธํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/facebook/jest/pull/6792

@SimenB ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

jest ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ "setupTestFrameworkScriptFile" ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ (๋ฌด์—‡๋ณด๋‹ค๋„) localStorage ๋ฐ sessionStorage์— ๋Œ€ํ•œ ํด๋ฆฌํ•„์„ ํฌํ•จํ•˜์—ฌ ์ผ๋ถ€ ์„ค์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(์•ฑ์—์„œ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—). ๊ธฐ๋ณธ์ ์œผ๋กœ window.localStorage = window.localStorage || { ... } ์ด๊ณ  sessionStorage์—์„œ๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ... ๋Š” ๋ชจ์˜ ํ•จ์ˆ˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ์ด์ œ ํ•ญ์ƒ ๊ธฐ๋ณธ๊ฐ’( window.localStorage = { ... } )์„ ์žฌ์ •์˜ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๊ทธ ์ค‘ ์•„๋ฌด ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ sessionStorage.getItem ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์ง€๋งŒ localStorage ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์œ„์—์„œ ๊ถŒ์žฅํ•œ ๋Œ€๋กœ "testURL"์„ " http://localhost "๋กœ ์„ค์ •ํ•œ ํ›„์—๋Š” ๋ชจ๋‘ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. window.sessionStorage.getItem = jest.fn(); ๊ฐ€ ์žˆ๋”๋ผ๋„ ํ›„์† expect(window.sesssionStorage.getItem).toHaveBeenCalled() ํ•˜๋ฉด ๋ชจ์˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๋ง์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ์ถ”๊ฐ€๊ฐ€ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ๋งˆ์ด๋„ˆ ๋ฒ„์ „ ๋ณ€๊ฒฝ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ, ์ด๊ฒƒ์ด ๋ธŒ๋ผ์šฐ์ €์˜ ํ‘œ์ค€ ๋ถ€๋ถ„์ด๊ณ  ์ƒˆ ๊ตฌํ˜„์„ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ์กฐ๋กฑํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒฝ์šฐ, ์ด๋Š” _์ด๋Š”_ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€์ž…๋‹ˆ๋‹ค. .

๋‚ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ฐพ์€ ์œ ์ผํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‚ด package.json์— jsdom์„ ์ถ”๊ฐ€ํ•˜๊ณ  11.11.0 ๋ฒ„์ „์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€ ์•Š์œผ๋ฉฐ ๋‚˜์ค‘์— ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ ์ถ”๊ฐ€ ์ž‘์—…์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์ฐจ๋‹จ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ jsdom์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ชจ์˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ ํ…œํ”Œ๋ฆฟ์— ๋”ฐ๋ผ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜๋ฉด ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ jsdom์˜ localStorage๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์กฐ๋กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ์‹คํ–‰ ์ค‘์ผ ๋•Œ ๋นŒ๋“œ ์„œ๋ฒ„์—์„œ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

"๊ฐœ๋ฐœ์ž๊ฐ€ ์‹คํ–‰ ์ค‘์ผ ๋•Œ ๋นŒ๋“œ ์„œ๋ฒ„์—์„œ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค."

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

"^"์— ๋Œ€ํ•ด @mrobrian ์— ์™„์ „ํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋ฏธ์นœ ๊ฒƒ. npm์€ ์ข…์†์„ฑ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฐฉ๋ฒ•์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

packge-lock.json ๋ฐ yarn.lock ์‚ฌ์šฉํ•œ @domenic ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์˜๋„์ ์œผ๋กœ ์†์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „์—๋Š” ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ”๋“œ ๊ฒ€ํ†  ๋ฐ ๋ณ‘ํ•ฉ์— ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ข…์ข… ์ด ํŒŒ์ผ์„ ์‚ญ์ œํ•˜์—ฌ ๋‹ค์‹œ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข…์†์„ฑ์ด ๊ฑฐ์˜ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์ง€๋งŒ ๋งค์šฐ ์ž์ฃผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ์˜ .npmrc :

save-exact = true
package-lock = false

์ด ์ƒˆ ์ค„์„ package.json์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

"jest": {
    "verbose": true,
    "testURL": "http://localhost/"
  },

jsdom์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ url์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const dom = ์ƒˆ๋กœ์šด JSDOM(``, {
URL: "https://example.org/",
});

jest ๊ฐœ๋ฐœ์ž๋Š” ์ด์ „์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ "testEnvironment": "node" ๊ฐ€ CLI/๋…ธ๋“œ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ์ด์œ ( localStorage ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด)์— ๋Œ€ํ•ด ๋…ผํ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ๋ฒ„๊ทธ์ธ๊ฐ€์š”?

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

์ด๊ฒƒ์€ Jest ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์งˆ๋ฌธํ•˜๊ธฐ์— ์ ํ•ฉํ•œ ์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. jsdom์€ ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์œ„์˜ ์˜๊ฒฌ์—๋Š” ์ด๋ฏธ ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€.json

   ...
  "jest": {
    "testEnvironment": "node",
    "roots": [
      "test/javascript"
    ]
  },

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

@p8ul ์ด ๋งž์•˜์Šต๋‹ˆ๋‹ค. " http://localhost "๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”(Jest 23.5.0 ์ดํ›„ ๊ธฐ๋ณธ ์„ค์ • URL, #6792 ์ฐธ์กฐ).

const dom = new JSDOM(``, {
url: "http://localhost",
});

์ „์ฒด๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์‹ฌ์ง€์–ด ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค :

"testEnvironment": "node"

jest 23.5.0์—๋Š” ์ด์ œ ์ด์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/facebook/jest/issues/6766#issuecomment -412516712

@mica16๊ณผ ์œ ์‚ฌ https://github.com/jsdom/jsdom/issues/2304#issuecomment -412663502

const dom = new JSDOM(``, {
  url: "http://localhost",
});

์ด ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์œ ์ผํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ชจ์นด/ํšจ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์—๋Š” ๋†๋‹ด์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช…๋ น์ค„์—์„œ --env node ์„ค์ •๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@gokulkrishh http://localhost/ ํ–ˆ์ง€๋งŒ ์œ ํšจํ•œ URL์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด "location.href"๊ฐ€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

@domenic Jest ๊ด€๋ฆฌ์ž๊ฐ€ ๋ฒ„์ „ 23.5.0์—์„œ ์ด ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค๊ณ  ์ƒ๋‹จ์— ์žˆ๋Š” ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. https://github.com/facebook/jest/issues/6766#issuecomment -412516712

jest-config์— ๋Œ€ํ•œ testURL ๋ฅผ http://localhost ๋กœ ์„ค์ •ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ํŒŒ์ผ์— ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  "jest": { "testURL": " http://localhost%26quot%3B/ },
localhost ๋Œ€์‹  ip-port ์‚ฌ์šฉ
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm audit ์‹คํ–‰ํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•œ ํ›„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. npm audit fix ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•œ ํ›„ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Jest์—์„œ ์–ผ๋งˆ ๋™์•ˆ ์ˆ˜์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ซ๊ณ  ๋งŽ์€ ์ค‘๋ณต ํ•ญ๋ชฉ์ด ์žˆ๋Š”์ง€ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

"๋†๋‹ด": {
"์ƒ์„ธํ•œ": ์‚ฌ์‹ค,
"testURL": " http://localhost/ "
}
package.json ํŒŒ์ผ์— ์ด ์ฝ”๋“œ ์กฐ๊ฐ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

jsdom์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํ…Œ์ŠคํŠธ์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

``` ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ 1.6
/**

  • @jest-ํ™˜๊ฒฝ ๋…ธ๋“œ
    */

it('๋‚ด ํ…Œ์ŠคํŠธ', () => {
๊ธฐ๋Œ€(2 + 2).toBe(4);
});
```

๋‘ ๊ฐ€์ง€ ์˜ต์…˜์„ ๋ชจ๋‘ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

1) ํ…Œ์ŠคํŠธ ํŒŒ์ผ์˜ ๋งจ ์œ„์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

/**
 * @jest-environment node
 */

2) ๋‹ค์Œ ์Šคํƒ ์ž๋ฅผ package.json์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

"jest": {
    "testURL": "http://localhost/"
  }

๋‘ ์˜ต์…˜ ๋ชจ๋‘ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

package.json ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

"jest": {
    "verbose": true,
    "testURL": "http://localhost/"
  }

@gokulkrishh http://localhost/๋กœ ์„ค์ • ํ–ˆ์ง€๋งŒ ์œ ํšจํ•œ URL์€ ๋ชจ๋‘ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ดˆ๋ณด์ž์ž…๋‹ˆ๋‹ค. Jest.config.js์—์„œ testURL์„ ์„ค์ •ํ•œ ์œ„์น˜๋ฅผ ์ •ํ™•ํžˆ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@haiphu jest.config.js ๋ชจ๋“  ๊ณณ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด

{
"testURL": "http://localhost/"

// Your other config
}

๋‚ด package.json์— ์•„๋ž˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ณ  ์ง€๊ธˆ์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. :)

  "jest": {
    "testURL": "http://localhost/"
  },

์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋‚ด ์˜ค๋ฅ˜๋Š” ๋‹ค๋ฅธ typescript ๋ฒ„์ „์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์›์‚ฌ ์ž‘์—… ๊ณต๊ฐ„ + lerna๊ฐ€ ์žˆ๋Š” ๋ชจ๋…ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒจํ‚ค์ง€์˜ package.json์—๋Š” typescript@^3.3.3 ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ตœ์‹  typescript@^3.5.3 . ๊ธฐ์กด ํŒจํ‚ค์ง€์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ typescript@^3.3.3 ๋˜๋Š” typescript@^3.5.3 ๊ฐ™์€ ๋ฒ„์ „์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋‚˜๋Š” testURL ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

@tylerreece22 @gokulkrishh ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿ˜„

jest์˜ testURL ๊ตฌ์„ฑ ์ง€์‹œ๋ฌธ์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•œ ๋ถ„๋“ค์€ https://jestjs.io/docs/en/configuration#testurl -string์„ ์ฐธ์กฐ

jsdom์—์„œ ์ง์ ‘ ์˜ต์…˜์„ ์„ค์ •ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด(์˜ˆ๋ฅผ ๋“ค์–ด Mocha๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ). ์ด๊ฒƒ์„ setup.js์— ๋„ฃ์œผ์‹ญ์‹œ์˜ค.

let jsdom = require('jsdom-global')(
    undefined,
    {
        url: "http://localhost"
    }
);

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

jsdom ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด jest ๊ตฌ์„ฑ ์†์„ฑ testEnvironment ์„ node ๋กœ ์„ค์ •ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ( testURL ๋ฅผ ํ„ฐ์น˜ํ•  ํ•„์š” ์—†์Œ)
https://jestjs.io/docs/en/configuration#testenvironment - ๋ฌธ์ž์—ด

์‹ค์ œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ฐพ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ๋Š” new JSDOM('', { url: 'https://localhost' })

package.json ํŒŒ์ผ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค.

"๋†๋‹ด": {
"์ƒ์„ธํ•œ": ์‚ฌ์‹ค,
"testURL": " http://localhost/ "
}

URL ์„ค์ •์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ... ๋‚˜๋Š” react-native๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

URL ์„ค์ •์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ... ๋‚˜๋Š” react-native๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ์ด ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>');

JSDOM ์ƒ์„ฑ์ž์— URL์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>', {
  url: 'http://localhost/',
});

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

URL ์„ค์ •์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ... ๋‚˜๋Š” react-native๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ์ด ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>');

JSDOM ์ƒ์„ฑ์ž์— URL์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

const { JSDOM } = require('jsdom');
const jsdom = new JSDOM('<!doctype html><html><body></body></html>', {
  url: 'http://localhost/',
});

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! jest ๊ตฌ์„ฑ์— URL์„ ๋„ฃ์œผ๋ฉด ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. jsdom ์ƒ์„ฑ์ž์— URL์„ ๋„ฃ๋Š” ๊ฒƒ์ด ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

jest๋ฅผ 22์—์„œ 26์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ์ตœ์‹  ๋ฒ„์ „์˜ jest๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ํ˜„์žฌ 2020๋…„์— 26.5.0์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

package.json ํŒŒ์ผ์—์„œ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค.

"๋†๋‹ด": {
"์ƒ์„ธํ•œ": ์‚ฌ์‹ค,
"testURL": " http://localhost/ "
}

testURL ๋Š” ๊ธฐ๋ณธ URL์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ ์–ด๋„ Jest 26.x ์—์„œ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด

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