ํ
์คํธ ์ผ์ด์ค๋ก 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>)
์๋ ๋ ผ์ ์์ฝ:
์ด๊ฒ์ด "๋ธ๋ ์ดํน ์ฒด์ธ์ง"์ธ์ง ์ฌ๋ถ์ ๋ํ ์ง๋ฌธ์ ๋ํ ์๋ ์ฝ๋ฉํธ์ ์ ์ฌ์ ๋๋ค. ์ด ์ง๋ฌธ์ ์ดํ 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 ๊ฐ์ฌํฉ๋๋ค ๐
๋ํ ์ด๊ฒ์ ๊ฒฝํํฉ๋๋ค.
("+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);
});
๊ทธ๋ฌ๋ ํ ์คํธ ๊ฒฐ๊ณผ๋ 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
/**
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
์์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํผํ๊ธฐ ์ํด
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@gokulkrishh
http://localhost/
ํ์ง๋ง ์ ํจํ URL์ด ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.