7์ฃผ์ฐจ ๊ณผ์ ์ฒดํฌํฌ์ธํธ
๊ธฐ๋ณธ ๊ณผ์
HARD
7์ฃผ์ฐจ ๊ณผ์ ์ฒดํฌํฌ์ธํธ
๊ธฐ๋ณธ๊ณผ์
- ์ด 11๊ฐ์ ํ์ผ, 115๊ฐ์ ๋จ์ ํ ์คํธ๋ฅผ ๋ฌด์ฌํ ์์ฑํ๊ณ ํต๊ณผ์ํจ๋ค.
์ง๋ฌธ
Q. handlersUtils์ ๋จ๊ธด ์ง๋ฌธ์ ๋ต๋ณํด์ฃผ์ธ์. ์ด๋ฒคํธ๋ ์์ฑ, ์์ ๋๋ฉด fetch๋ฅผ ๋ค์ ํด ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํฉ๋๋ค. ์ด๋ฅผ ์ํ ์ ์ด๊ฐ ํ์ํ ๊ฒ ๊ฐ์๋ฐ์. ์ด๋ป๊ฒ ์์ฑํด์ผ ํ ์คํธ๊ฐ ๋ณ๋ ฌ๋ก ๋์๋ ์์ ์ ์ด๊ฒ ๋์ํ ๊น์? ์๋ ์ด๋ฆ์ ์ฌ์ฉํ์ง ์์๋ ๋๋, ๋ ๋ฆฝ์ ์ด๊ฒ ํ ์คํธ๋ฅผ ๊ตฌ๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด์ธ์. ๊ทธ๋ฆฌ๊ณ ์ด ๋ก์ง์ PR์ ์ค๋ช ํด์ฃผ์ธ์.
msw ๋ ๊ธฐ๋ณธ์ ์ผ๋ก server ํจ์๋ฅผ ์ฌ์ฉํ์ฌ http ๋ชจํนํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ ์์ต๋๋ค.
์ฒ์์ ๊ธฐ๋ณธ msw ์๋ฒ๋ ๊ธฐ๋ณธ ๊ฐ์ handler (get, put, post, delete, patch) ๋ฅผ ์ฌ์ฉํ๊ณ ํ
์คํธ ์ฝ๋ ์์์ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ๊ธฐ๋ณธ ํ๊ฒฝ๊ณผ ๋ค๋ฅธ ํ๊ฒฝ์ ๋
๋ฆฝ์ ์ผ๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด ๊ธฐ๋ณธ ํ๊ฒฝ์์์ ๋ค๋ฅธ ๊ธฐ๋ณธ ๋ฐ์ดํฐ์ ์๊ฐ ์ค์ ๋ค์ ์ฃผ์ด์ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์์ต๋๋ค.
๊ฐ ํ
์คํธ๊ฐ ๋
๋ฆฝ์ ์ธ ์ด๋ฒคํธ ๋ฐ์ดํฐ์ ํธ๋ค๋ฌ ํ๊ฒฝ์ ๊ฐ๊ฒ ํ์ฌ, ์ด๋ฒคํธ ์์ฑ/์์ ๋ฑ ์ํ ๋ณํ๊ฐ ์ธ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
TestEventManager๋ก ๊ฐ ํ
์คํธ๋ณ ์ด๋ฒคํธ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, server.use๋ฅผ ํตํด ๋ณ๋ ํธ๋ค๋ฌ๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์์ต๋๋ค.
์ด๋ก ์ธํด ๋ณ๋ ฌ ํ
์คํธ ์คํ ์์๋ ์ฌ์ด๋ ์ดํํธ ์์ด ์์ ์ ์ผ๋ก ๋์ํ๋ฉฐ, ํ
์คํธ ๊ฐ ๋ฐ์ดํฐ๊ฐ ๊ฒฉ๋ฆฌ๋๊ฒ ๋ฉ๋๋ค.
๋ฆฌํฉํ ๋ง ์
์ฌ์ค, ์ต์ด ๊ฐ๋ฐ์๋ server.use๋ก ์ค๋ฒ๋ผ์ด๋ฉ์ ํ๋ ํน์ http ๋ฉ์๋๋ง ๊ตฌ์ถํ๋ ๊ฒ์ด ์๋ get, post, put, delete ์ ๋ถ๋ฅผ ํ ๋ฒ์ setupMockHandler๋ก ๊ตฌ์ถํ์์ต๋๋ค.
put์ด๋ delete๋ฅผ ํ๊ธฐ์ํด์๋ ํ์์ ์ผ๋ก get์ ํด์ผํ๋ ๊ฒ์ด ์๋๊ฐ? ๋ผ๋ ๊ด์ ์ผ๋ก ์ค๊ณํ ๊ฒ์ด์์ต๋๋ค.
ํ์ง๋ง, ๊ณผ์ ๋ฅผ ํ๋ค๋ณด๋ ๋ฉ์ธ ํ๊ฒฝ์์ฒด๋ setupMockHandler๋ก ์ค์ ํด๋๊ธฐ๋ ํ๋ฉฐ, ์๋ํ๋๋๋ก๋ ๋์ํ์ง๋ง ์๋ชป๋จ์ ๊นจ๋ฌ์์ต๋๋ค. ์ฌ์ฉํ์ง์์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ฉฐ ํ ์คํธ ํ๊ฒฝ์์๋ ํ ์คํธ์นํ์ ์ด ์ ์ด์ง ๋ชปํ ํ๊ฒฝ์ด ๋์ด๋ฒ๋ ธ์ต๋๋ค. ํ๋์ ๋ชฉ์ ์ฑ์ ๋๊ณ ์์ฑํด์ผํ ์ฝ๋๋ฅผ ํ๊ณณ์ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ ๊ฒฉ์ด์์ต๋๋ค.
์ด๋ฅผ ๊นจ๋ซ๊ณ ํด๋น ๋ถ๋ถ์ ๋ฆฌํฉํ ๋ง ํ์ฌ ์๋ํ๊ณ ์ ํ๋๋๋ก ๋ถ๋ฆฌํ์ฌ ๊ต์ฒดํ์ต๋๋ค.
Q. ํ ์คํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌ๋์ํค๊ธฐ ์ํด ์์ฑํ๋ ์ค์ ๋ค์ ์๊ฐํด์ฃผ์ธ์.
์ฌ์ค, ์ค์ ์ ๋ฐ๋ก ํ์๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ณผ์ ๋ฅผ ์งํํ๋ฉด์ ๋ ๋ฆฝ์ ์ธ ํ ์คํธ ๊ตฌ๋์ด ์๋์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
- setupTest ํ์ผ์์ ๊ธฐ๋ณธ์ ์ธ handler ๋ฐฐ์ด์ ๋์ด ๊ธฐ๋ณธ์ ์ธ ํ ์คํธํ๊ฒฝ์ ๊ตฌ์ถ
- ์ปค์คํ ํ ์ค์ ์ด๋ ํ ์คํธ ํ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ์๋ handlerUtils์์ ์์ฑํ ํจ์๋ฅผ ๊ฐ์ ธ์ ์๋ก์ด ๊ฐ๋ฐํ๊ฒฝ์ ๊ตฌ์ถ
- ๊ฐ๋ฐํ๊ฒฝ ๊ตฌ์ถ์, ๋์ผํ ๋ฐ์ดํฐ์ฐธ์กฐ๋ฅผ ์ํด์ eventManager๋ฅผ ๋์ด ๋ฐ์ดํฐ ๊ณต์
- ๋์ผํ ํ ์คํธ ํ๊ฒฝ๋จ์๋ก ๋ฌถ์ด์ beforeEach, afterEach ์ฌ์ฉ
์ฌํ ๊ณผ์
- App ์ปดํฌ๋ํธ ์ ์ ํ ๋จ์์ ์ปดํฌ๋ํธ, ํ , ์ ํธ ํจ์๋ก ๋ถ๋ฆฌํ๋๊ฐ?
- ํด๋น ๋ชจ๋๋ค์ ๋ํ ์ ์ ํ ํ ์คํธ๋ฅผ 5๊ฐ ์ด์ ์์ฑํ๋๊ฐ?
๊ณผ์ ์ ํํ๊ณ
์๋ง! ๋ ํ ์คํธ์ฝ๋ ์๊ฒ๋๊ณ ์์ฑ๋ ํด๋ดค์ด!!
๊ธฐ์ ์ ์ฑ์ฅ
์๋ก ํ์ตํ ๊ฐ๋
vi.useFakeTimers({ shouldAdvanceTime: true })- ํตํฉํ ์คํธ ์ค์์ ๋ค๋ฅธ ํ ์คํธ์ ๋ฌ๋ฆฌ ์ ๋ง ์ค๋ ์๊ฐ์ ๋ถ์ก๊ณ ์์๋ ํ ์คํธ ์ฝ๋์ ํด๊ฒฐ๋ฒ!
- ๊ธฐ๋ฅ :
- notifications ์๋์ ๊ธฐ๋ฅ์ setInterval ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ์ผ์ ์๊ฐ ์ด๋ด๊ฐ ๋๋ฉด ์๋์ ๋์์ค์ผ ํ๋ ๊ฒ.
- ๋ฌธ์ ์ :
- ์ํ๋ ์๊ฐ์ผ๋ก ์ค์ ํ์ฌ ์๋๋ฉ์์ง๋ฅผ ๋ณด๊ธฐ์ํด ํตํฉํ ์คํธ์์ useFakeTimers๋ฅผ ์ฌ์ฉํ๋ค. ํ์ง๋ง, ํ ์คํธ ํ๊ฒฝ์์ ๊ณ์ ํ์์์ ์๋ฌ๋ง ๋ฑ์ด๋๋ค.
- ํด๊ฒฐ๋ฒ :
useFakeTimer๋ด๋ถ์shoutdAdvancedTime์ต์ ์ true๊ฐ์ ์ฃผ์ด, '์ค์ ์๊ฐ'์ฒ๋ผ ์๊ฐ์ด ํ๋ฅด๋ ๊ฒ์ฒ๋ผ fake timer๊ฐ ์๋์ผ๋ก ์๊ฐ ๊ฒฝ๊ณผ๋ฅผ ๋ฐ์ํ๋ค.- faketimer๋ฅผ ์ฌ์ฉํ๋ ๊ณณ ๋ณด๋ค๋ ๋ ์๋จ์ ์ธํ
์์ beforeAll ๋ด๋ถ์
vi.useFakeTimers({ shouldAdvanceTime: true })์ ์ค์ ํ์ฌ ์ค์ ๋ชจ๋ ํ ์คํธ์ฝ๋ ํ๊ฒฝ์์๋ ์ค์ ์๊ฐ์ฒ๋ผ ํ๋ฅด๊ฒ ํ ์ ์๋ค!
๊ธฐ์กด ์ง์์ ์ฌ๋ฐ๊ฒฌ/์ฌํ
- ์๋ ์ ๋ค๋ฅธ ์ฌ๋ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ค์ ธ๊ฐ๊ณ ๋ ํํ๋ฉด์ ์จ๋ดฃ๋ msw๋ฅผ ๋ค์ ์จ๋ด์ ์ข์๋ค!
- ๊ทธ๋์๋ ์ดํดํ๊ธฐ ์กฐ๊ธ ์ด๋ ค์ ์ง๋ง, ์ด๋ฒ ๊ณผ์ ๋ฅผ ํ๋ฉด์ ์ค๋ฒ๋ผ์ด๋ฉ์ ์๊ฒ๋์ด์ ์ ์ตํ๋ค. ์ค๋ฒ๋ผ์ด๋ฉ์ ํตํด ๋ ๋ฆฝ์ ์ด๋ฉฐ ๋ณ๋ ฌ์ ์ผ๋ก ํ ์คํธํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์๋ค๋ ์ ์ด ์ข์๋ค.
- ํ ์คํธ ์ฝ๋๋ ์๊ฐ๋ณด๋ค ์ด๋ค ๊ฒ์ ํ ์คํธํ๊ณ ์ด๋ค ๋ฒ์๋ฅผ ํด์ผํ๋์ง ์ ์ ํ๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ต๋ค.
๊ตฌํ ๊ณผ์ ์์์ ๊ธฐ์ ์ ๋์ ๊ณผ ํด๊ฒฐ
- ๋ด ์ธ์์ ๋ด ์๊ฐ๋ฝ์ผ๋ก ์ง์ ์น ํ ์คํธ์ฝ๋!! ํฌ๊ธฐํ์ง ์๊ณ ๊ณผ์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ๊ธฐ์ ์ ์ธ ๋์ ์ด์ ํด๊ฒฐ์ด์๋ค.
์ฝ๋ ํ์ง
ํนํ ๋ง์กฑ์ค๋ฌ์ด ๊ตฌํ
- ๋ง์กฑ์ค๋ฌ์ด ๊ฒ์ด..
src/__tests__/medium.integration.spec.tsxํตํฉํ ์คํธ ์ฝ๋? ๋ถ๋๋ฌ์์ ๋ง์กฑ์ค๋ฌ์ด๊ฒ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ถ ์์ฌ์!!
๋ฆฌํฉํ ๋ง์ด ํ์ํ ๋ถ๋ถ
- ๊ฐ์ธ์ฌ์ ์ผ๋ก ๊ณผ์ ๋ฅผ ๋ฆ๊ฒ ์งํํ์ด์ easy unit test๋ ๊ฐ๋ ์ ์ตํ๋ฉด์ ํ ์์๋๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค. ๊ณผ์ ๋ฅผ ๋คํ๊ณ ์๊ฐ์ด ๋จ์ผ๋ฉด ์ ๋ ํ ์คํธ ๋ถ๋ถ์ ๋ฆฌํฉํ ๋งํด๋ณด๊ณ ์ถ๋ค๊ณ ์๊ฐํ๋๋ฐ, ์ฌ์ ๊ฐ ์์ง ๋ชปํ๋ค์.
ํ์ต ํจ๊ณผ ๋ถ์
๊ณผ์ ํผ๋๋ฐฑ
- easy์์๋ถํฐ ์ง์ ๊ฐ๋จํ ์ ๋ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ฐ ์ ์ ๋ฒ์๊ฐ ๋์ด์ง๊ณ describe๋ ์ง์ ์ถ๊ฐํ๊ฒ ๋๋ ํ์ต ๋ฐฉํฅ์ด ์ฌ๋ฐ์์ต๋๋ค.
- ํตํฉํ ์คํธ ์ค notifications ํ ์คํธ ์ฝ๋ ์์ฑํ๋ฉด์ hard๋ฅผ ์ ํํ ๊ฒ์ ๋ฌด์งํ๊ฒ ํํํ์๋๋ฐ, ๊ทธ๋งํผ ๋ง์ด ๊ณ ๋ฏผํ์ด์ ์ข์์ต๋๋ค! ๊ฐ์ธ์ฌ์ ์ผ๋ก ์๊ฐ ํฌ์๋ฅผ ๋ชปํ๊ฒ์ด ์์ฌ์ธ ๋ฐ๋ฆ์ด๋ค์.
๋ฆฌ๋ทฐ ๋ฐ๊ณ ์ถ์ ๋ด์ฉ
๊ณผ์ ํผ๋๋ฐฑ
"์๋ง! ๋ ํ ์คํธ์ฝ๋ ์๊ฒ๋๊ณ ์์ฑ๋ ํด๋ดค์ด!!" ใ ใ ์ํ์ต๋๋ค. ์ด๋ฒ ๊ณผ์ ๋ ํ ์คํธ๋ฅผ ํ๋ ๋ค์ํ ๋ฐฉ๋ฒ๋ค์ ์ ํ๋ฉด์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ผ๋ ๊ทธ ์ฌ๋ฆฌ์ ์ฅ๋ฒฝ์ ํ๋ฌผ๋ก ์น์ํด์ง๋๋ฐ ์์์ต๋๋ค. ํ๊ณ ๋ฅผ ๋ณด์ํ๋ ์ ์ํํด์ค ๊ฒ ๊ฐ๋ค์. ใ
"๋ด ์ธ์์ ๋ด ์๊ฐ๋ฝ์ผ๋ก ์ง์ ์น ํ ์คํธ์ฝ๋!! ํฌ๊ธฐํ์ง ์๊ณ ๊ณผ์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ๊ธฐ์ ์ ์ธ ๋์ ์ด์ ํด๊ฒฐ์ด์๋ค." ํ๋ฅญํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฒ ์ณ๋ณธ ๊ฒฝํ์ผ๋ก ์์ผ๋ก ๋ชฐ๋ผ์ ์๊ธฐ๋ ๋๋ ค์์ด๋ ๊ท์ฐฎ์์ ๋ง์ด ๊ทน๋ณตํด์ง๊ฒ ๋๊ธฐ๋ฅผ ๋ฐ๋์.
๋๋ฅผ ๋์ ํด์ ์ปดํจํฐ๊ฐ ํ ์คํธ๋ฅผ ํ๊ธฐ์๋ ๋ค์ํ ๋ฐฉ๋ฒ๋ค์ด ํ์ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ๊ณ ๋ฐ๋๋ก ํ ์คํธ๋ฅผ ํ ๋ ๋๋ผ๋ฉด ์ด๋ป๊ฒ ํ ๊น๋ฅผ ๋ ์ฌ๋ ค๋ณด๊ณ ์ด๋ฅผ ์ปดํจํฐ๋ผ๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น ๋ผ๋ ์๊ฐ๋ค์ ๋ฐ๋ณตํ๋ค๋ณด๋ฉด ์ด๋์ ์ฝ๋ฉ์ ์์ฑํ ๋์๋ ํ ์คํธํ๊ธฐ ํธํ๊ฒ ์์ฑ์ ํ๊ฒ ๋๊ณ ์ด๋ฌํ ์๊ฐ์ต๊ด์ ๊ฒฐ๊ณผ๋ฌผ๋ค์ด ์ข์ ์ฝ๋๋ฅผ ๋ง๋ค์ด ์ค๊ฑฐ์์.
์๊ณ ํ์ จ์ต๋๋ค. ๋ค์ ์ฃผ์ฐจ๋ TDD๋ค์. ํ์ดํ ์ ๋๋ค.