React Testing Pattern
Last updated
Last updated
์ ๋ํ ์คํธ๋ฅผ ์ํํ ๋ ๊ฐ ํ ์คํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ด์ผ ํ๊ณ ์ธ๋ถ ํ๊ฒฝ์ ์ํฅ์ ๋ฐ์ง ์๊ณ ํญ์ ๋์ผํ ํ๊ฒฝ์์ ์์ํ ๋ชจ๋์ ๋์๋ง์ ๊ฒ์ฆํด์ผ ํ๋ค.
ํ ์คํธ๊ฐ ์์๋๊ธฐ ์ ์ ์ํ๋๋ฉฐ ๋์ผํ ํ๊ฒฝ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ณ์ ์ค์ ๋ฐ mock์ ์ฃผ์ ํ๋ค.
jest์์ ์ ๊ณตํ๋ beforeEach
beforeAll
๋ฑ์ ํจ์๋ค์ ์ฌ์ฉํด์ ๋ฏธ๋ฆฌ ์ค์ ํ๊ณ ์ ํ๋ ๊ฐ๋ค์ ์ ์ํ๊ฑฐ๋ ๋ชจํนํ๋ค.
beforeAll() โ ๋์ผํ ์ค์ฝํ ๋ด(์์ํฌํจ) ํ ์คํธ๋ค์ด ์์๋๊ธฐ ์ ๊ฐ์ฅ ๋จผ์ ํ๋ฒ ์ํ
beforeEach() โ ๋์ผ ์ค์ฝํ ๋ด(์์ํฌํจ) ๊ฐ๊ฐ์ ํ ์คํธ ํจ์๊ฐ ์คํ๋๊ธฐ ์ด์ ์ ์ํ
ํ ์คํธ์ ์ข ๋ฃ ํ ๋ง๋ฌด๋ฆฌ, ์ดํ ํ ์คํธ์ ์ํฅ์ด ์๋๋ก ์ธํ
AfterEach() โ ๋์ผ ์ค์ฝํ ๋ด(์์ํฌํจ) ๊ฐ๊ฐ์ ํ ์คํธ ํจ์๊ฐ ์ข ๋ฃ๋ ์ดํ ์ํ
AfterAll() โ ๋์ผํ ์ค์ฝํ ๋ด(์์ํฌํจ) ํ ์คํธ๋ค์ด ๋ชจ๋ ์ํ๋ ํ ๋ง์ง๋ง์ ํ๋ฒ ์ํ
React Testing Library ํจ์ ๋ด๋ถ์์ ์ด๋ฏธ ์ค์ /ํด์ง๋ฅผ ์งํํ๊ณ ์์ด ์ผ๋ฐ์ ์ผ๋ก ๋ณ๋์ ์ค์ ์ ์ฒ๋ฆฌํ์ง ์์๋ ๋์ง๋ง ํ ์คํธ์ ๋ ๋ฆฝ์ ์ํ ๋ณด์ฅ์ ์ํ ๊ฐ๋ ์ ์ดํดํด์ผ ํ๊ณ ๋ณ๋๋ก ์ค์ /ํด์ง๊ฐ ํ์ํ ์ฝ๋๊ฐ ์กด์ฌ
setTimeout, setInterval, clearTimeout, clearInterval
Timer๋ฅผ ์ฌ์ฉํ์ฌ ๋ช์ด ๋ค์ ์ด๋ฒคํธ๋ฅผ ์คํํ๋ ๋ฑ์ ์ฝ๋๋ค์ ํ ์คํธ๊ฐ Timer๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ฉฐ ์ด๋ก ์ธํด ํ ์คํธ๋ ๋๋ ค์ง๊ณ ์์ธก ๋ถ๊ฐ๋ฅํด์ง๋ค.
์ด๋ฐ ๊ฒฝ์ฐ jest์์ ์ ๊ณตํ๋ fake timer
๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์ข๋ค.
ํ ์คํธ๋ ์ฌ์ฉ์๋ค์ด ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ชจ๋ฐฉํด์ผํ๋ค.
Queries Accessible to Everyone
๋ชจ๋๊ฐ ์ ๊ทผํ ์ ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์ข๋ค. (ํ๋ฉด์ ๋ณด๊ณ ์๋ ์ฌ์ฉ์๋ , ์คํฌ๋ฆฐ๋ฆฌ๋๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ )
getByRole
: ์ ๊ทผ์ฑ ํธ๋ฆฌ์ ๋
ธ์ถ๋ ๋ชจ๋ ์์๋ฅผ ์ฟผ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋จ
๊ฑฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ํด๋น ์ต์ ์ด ๊ฐ์ฅ ์ ํธ๋จ,
์ด ์ต์ ์ผ๋ก ์ป์ ์ ์๋ ๊ฒ๋ค์ UI์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ผ ์ ์์
getByLabelText
: ํผ ํ๋์ ์ ํฉ, ๋ ์ด๋ธ ํ
์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ฅผ ์ฐพ์
getByPlaceholderText
:๋ ์ด๋ธ์ ๋์ฒด ํ ์ ์์ง๋ง, ๋ค๋ฅธ ๋์๋ณด๋ค๋ ๋ซ๋ค.
getByText
: ํผ ์ธ์ ํ
์คํธ ์ปจํ
์ธ ๋ฅผ ์ฐพ๋ ์ฃผ์ ๋ฐฉ๋ฒ, div
, span
, p
๋น๋ํํ ์์๋ฅผ ์ฐพ๋๋ฐ ์ฌ์ฉ๋จ
getByDisplayValue
: ํผ ์์์ ํ์ฌ ๊ฐ์ผ๋ก ์์๋ฅผ ์ฐพ๋๋ฐ ์ ์ฉ
์๋ฏธ๋ก ์ ์ธ ์ฟผ๋ฆฌ, HTML5 & ARIA ์ ํ๊ธฐ, ํด๋น ์์ฑ๋ค์ ๋ธ๋ผ์ฐ์ ์ ๋ณด์กฐ ๊ธฐ์ (์คํฌ๋ฆฐ๋ฆฌ๋๊ธฐ)์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋ฏ๋ก ์ผ๊ด์ฑ์ด ์กฐ๊ธ ๋จ์ด์ง, -> ์์ฑ์ด ํ์๋๋ ๋ฐฉ์์ด ์ผ๊ด๋์ง ์๋ค! ์ฌ์ฉ์๋ค์ด ์ํํธ์จ์ด์ ์ํธ์์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ ์คํธ๊ฐ ์งํ๋๊ณ ์๋์ง ์ ์ ์๋ค.
getByAltText
: ์์์ ๋์ฒด ํ
์คํธ(์ด๋ฏธ์ง, ์์ญ, ์
๋ ฅ ๋ฐ ๋ชจ๋ ์ฌ์ฉ์ ์ ์ ์์)๊ฐ ์ง์๋๋ ์์์ธ ๊ฒฝ์ฐ ์ฐพ๊ธฐ ๊ฐ๋ฅ
getByTitle
: ์คํฌ๋ฆฐ๋ฆฌ๋๊ธฐ์์ ์ผ๊ด๋๊ฒ ์ฝํ์ง ์๊ณ ์๊ฐ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์๋์ง ์์
์ตํ์ ์๋จ
์ฌ์ฉ์๋ค์ด Test ID์ ์ํธ์์ฉ ํ ์ผ์ ์ ๋ ์๋ค.
getByTestId
: ์ฌ์ฉ์ ์
์ฅ์์ ๋ณด๊ฑฐ๋ ๋ค์ ์ ์๋ ์์๋ก ์ญํ ์ด๋ ํ
์คํธ๋ณ๋ก ์ผ์น์ํฌ ์ ์๊ฑฐ๋ ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ(์: ํ
์คํธ๊ฐ ๋์ ์ธ ๊ฒฝ์ฐ)์๋ง ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉ
์์๋ฅผ ์ฐพ๋๋ฐ ๊ฐ์ฅ ์ ํฉํ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ์์ฃผ๋ ํฌ๋กฌ ์ต์คํ ์
ํ ์คํธ ์ฝ๋๋ 3๋จ๊ณ๋ก ๋๋์ด ํด๋น ํ ์คํธ๊ฐ ๋ฌด์์ ํ๊ณ ์ด๋ค ๋ชฉ์ ์ ๊ฐ๋์ง ๋ณด๋ค ๋ช ํํ๊ฒ ์ดํดํ ์ ์๋๋ก ๊ตฌ์ฑ
Arrange (์ค๋น)
ํ ์คํธ ์คํ ์ค ํ์ํ ๊ฒ๋ค์ ์ค๋น
BeforeEach
, afterEach
Render Components
Mocking, State, Service ๋ฑ
Act (์คํ)
ํ ์คํธ ์ฝ๋ ์คํ
User์ Action (Click, State change ๋ฑ)
RTL์ act() wrapping ๋ถํ์
Assert (๋จ์ธ)
์คํํ ์ฝ๋ ๊ฒฐ๊ณผ์ ๋์์ ๊ฒ์ฆ
Text, State, Child count ๋ฑ
์ปดํฌ๋ํธ๊ฐ ๋ณต์กํ๋ค๋ฉด ์ธํฐ๋ ์ ๋จ์ ๊ฒ์ฆ์์ ์ปดํฌ๋ํธ์ ๋ชฉ์ ๊ณผ ๋์์ ๋ง์ถ์ด ํ ์คํธ๋ฅผ ์ปดํฌ๋ํธ๋ณ ๋์๋ณ๋ก ๋ถ๋ฆฌํด์ ์งํ
Ex) List - Item ๊ด๊ณ (Container - Child)
List ์ปดํฌ๋ํธ โ list ์กฐ๊ฑด์ ๋ฐ๋ผ list count๊ฐ ์๋๋์ง ํ์
Item ์ปดํฌ๋ํธ โ child component๋ค์ property, value ๊ฐ์ ๊ฐ์ง๊ณ ์ฌ๋ฐ๋ฅด๊ฒ render ๋๋์ง
Component๋ฅผ Renderํ๊ณ document.body์ ๋ถ์ธ๋ค.
query objects โ render ๋ DOM์์ ํน์ element๋ฅผ ์กฐํํ ๋ ์ฌ์ฉ === screen
์ฌ์ฉ
container โ React ์ปดํฌ๋ํธ๊ฐ render ๋ DOM node, div
baseElement โ container๊ฐ ๋ค์ด์๋ DOM node, default - body
rerender โ props๋ฅผ ๋ณ๊ฒฝํ์ฌ component update ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
unmount โ ๋ฉ๋ชจ๋ฆฌ ์ ์๋ฅผ ์ ๋ฐํ๋ event handler๋ฅผ ๋จ๊ฒจ๋๋ ํ ์คํธ ์๋ ์ ์ ์ฉ, ๋๋ ์ปดํฌ๋ํธ๊ฐ unmount ๋๋ ์์ ์ ํ ์คํธํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
ํจ์ํ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ Hook์ ํ ์คํธํ๋ ํจ์
React v18 ๋ถํฐ RTL/react์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋์ด์ง
๋ฆฌ์ํธ ๋ ๋๋ง ๋ฉ์ปค๋์ฆ์ ๋ฐ๋ฅด๋ ๋จ์ํ ํจ์๊ธฐ ๋๋ฌธ์ ๋ ๋ฆฝ์ ์ธ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ ํฉํจ
renderHook ํจ์ ์์ ์ฝ๋ฐฑ์ผ๋ก hook์ ๋ฃ๊ณ ํ ์คํธ
return object์ reulst ์์ฑ์ ํตํด ํ ์ ๋ฐํ๊ฐ์ ํ์ธํ ์ ์๋ค.
result.current
โ ์ฝ๋ฐฑํจ์๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ฆฌํดํ ๊ฐ
current
โ ์ปค์คํ
ํ
์ ์ฌ๋ฌ๋ฒ ํธ์ถ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง ์คํ๊ฐ์ธ current๋ฅผ ์ฐธ์กฐ
custom hook์ด context API ๋๋ redux์ dispatch๊ฐ์ context๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
renderHook์ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก contextProvider Wrapper๋ฅผ ์ ๊ณต
custom hook์ด async ๋์์ ์ํํ ๋