React Testing Library
๐ React Testing Library
๋ฆฌ์กํธ์์ TDD ๋ฐฉ์์ ๊ฐ๋ฐ์ ํ๊ธฐ ์ํด์ ํ ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ณด์.
๐ฏ ๋ชฉ์
1. ๋ฒ๊ทธ ์บ์น
ํ ์คํธ๋ฅผ ํตํด ์์์น ๋ชปํ ์ฌ๋ฌ๊ฐ์ง ๋ฒ๊ทธ๋ค์ ์ฌ์ ์ ํ์ธํ๊ธฐ ์ฉ์ดํ๋ค.
2. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ขฐ๋ ํฅ์
์ด๋ ํ ๊ทผ๊ฑฐ๋ก ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋๋ก ๋์ํ๋์ง ๊ทผ๊ฑฐ๋ฅผ ๋ท๋ฐ์นจํ๊ณ ์ด ๊ทผ๊ฑฐ์ ๋ํ ์ ๋ขฐ๋๋ฅผ ๋์ผ ์ ์๋ค.
3. ์ง๋ฌธ ๋ฐ ๋ต๋ณ ์๊ฐ ์ถ์
๋๊ตฐ๊ฐ ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ง๋ฌธํ์ ๋ ๊ทธ์๋ํ ๋ต๋ณ์ผ๋ก ์ด ํ ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํ๋ฉด๋๋ค. ๊ทธ๋ผ์ผ๋ก ์๊ฐ์ ์ ์ฝํ๊ณ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์๋ค.
4. ๋ฌธ์ ์ญํ
ํ ์คํธ๋ผ๋ ๋ฌธ์๋ฅผ ์ ๊ณตํจ์ผ๋ก์ 2,3๋ฒ์ ์ฅ์ ์ ๊ฐ๋ฅํ๋๋ก ํ๋ค.
๐ผ ์ฌ์ฉ๋ฐฉ๋ฒ
์ฐ์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ค๋ค.
1 | npm install --save-dev @testing-library/react |
๋ฆฌ์กํธ ํ ์คํ ๋ผ์ด๋ธ๋ฆฌ๋ฌ์ DOM ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ฌ์ฉ์ ํ๋ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ์ฌ ํ ์คํธ ๊ฐ๋ฐ์ ํด๋ณด์.
๐ฆ Component ํ ์คํธ
โ๏ธ ํ ์คํธ ์ฝ๋ ์์ฑํ๋ ๋ฐฉ๋ฒ
ํ ์คํธ๊ฐ ํ์ํ ์ปดํฌ๋ํธ ๋ ๋๋ง
์ปดํฌ๋ํธ์ ์์ ํ์
์์์์ ์ํธ์์ฉ
์ด์ค์ ํ ์คํธ ๊ฒฐ๊ณผ์ ๊ธฐ๋ ๊ฐ์ด ์ผ์นํ๋ ์ง ํ์ธ
์ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํด์ฃผ์.
๐ Tip ์ปดํฌ๋ํธ ์์ฑ
์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ๊ธฐ ์ํด yamoo9๋์ด ์ ๊ณตํด์ค Tool์ ์ฌ์ฉํด๋ณด๋๋กํ์.
1 | npx degit yamoo9/create-react-component create-react-component |
1 | // package.json |
1 | npm run rc -- ์ปดํฌ๋ํธ_์ด๋ฆ // ์ปดํฌ๋ํธ ์์ฑ |
ESLint ์์ ํ ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ๋๋ฉด ์ค๋ฅ๋ฅผ ๋์์ฃผ๋๋ฐ ์ด์ ๋ํ Lint ๊ฒฝ๊ณ ๋ฅผ ๊บผ๋์.
1
2
3
4
5 // package.json
{
"eslintConfig":{...},
"testing-library/no-debugging-utils": "off"
}
์์
1. ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ํ์ธ
1 | // ToggleButton.jsx |
1 | // ToggleButton.test.jsx |
getByText()
: ๊ฐ์์ผ๋ก ๊ทธ๋ ค์ง ๋ฌธ์์ ์กด์ฌํ๋ ๊ฒ๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค. ๋ง์ฝ ์กด์ฌ ํ์ง ์๋ ๋ค๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค.queryByText()
: ์กด์ฌํ์ง ์์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง ์๊ณnull ๊ฐ์ผ๋ก ๊ฐ์ ธ์จ๋ค.
2. ํ์ฑํ ์ํ ์ฌ๋ถ์ ๋ฐ๋ผ ํ ์คํธ ํ์
1 | // ToggleButton.jsx |
1 | // ToggleButton.test.jsx |
- ๋ง์ฝ on ์ผ๋์ text์ off์ผ ๋์ text๋ฅผ ์ฐพ๊ณ ์ถ๋ค๋ฉด
queryAllText()
๋ฅผ ์ฌ์ฉํด์ค๋ค, cleanup()
์ ํด์ค์ผ์ง๋ง firstElement๋ฅผ ํ์ธํ ๋, ์์ ๊ทธ๋ ค์ง ๊ฒ์ ์ง์ฐ๊ณ ์๋ก ๊ทธ๋ ค์ง ๊ฒ์ ๋น๊ตํด์ค ์ ์๋ค.
3. onToggle ์์ฑ(prop)์ ์ฐ๊ฒฐ๋ ํจ์ ์คํ ํ์ธ & ํ์ฑ ์ํ ์ปดํฌ๋ํธ๋ ToggleButton--on
ํด๋์ค ์ด๋ฆ ํฌํจ ํ์ธ
1 | // ToggleButton.js |
1 | // ToggleButton.test.js |
fireEvent()
: ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ์ฃผ๋ ๋ฉ์๋์ด๋ค.queryByRole()
: ํด๋น ์์์ ์ญํ ์ ํ์ธํ๋๋ฐ ์ฌ์ฉ๋๋ค.ex) button ํ๊ทธ์ type์ โbuttonโ์ผ๋ก ๋ช ์์ ์ผ๋ก ์์ฑํ์๋์งโฆ
๐ ์๊ฐ
์ค๋ ์์ ์์ ์ํ๋ฅผ ๊ฐ์ง์ง ์๋ ์ปดํฌ๋ํธ์ ๋ค์ํ ํ ์คํธ ๋ฐฉ๋ฒ์ ๋ํด ์ค์ต์ ์งํํ์๋ค. ๋ฆฌ์กํธ๋ฅผ TDD ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐ์ ์งํํ๊ฒ ๋๋ค๋ฉด ์์ ๋งํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐ๋ ํฅ์ํ ์ ์๊ณ ํ ์คํธ ๋ฌธ์๋ฅผ ์์ฑํ์ฌ ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํ ์ ์๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
์์ง jest์ ์ต์ํ์ง ์์ ๋ฏ์ค๊ณ ์ด๋ ต์ง๋ง, ์ฐํ ์ฝ์์๋ jest๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ ์์ผ๋ก ์์ฃผ ์ฌ์ฉํด๋ณด๋ฉด์ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ์ ๋ํด ๋ชธ์ ์ตํ๋๋ก ํด์ผ๊ฒ ๋ค.