๋ฆฌ์กํธ ํ ํ ์คํธ
๊ฐ์์์ ์ฌ์ฉํ๋ ์์ ์ ๊ตฌ์กฐ๋ ์ด๋ ๋ค.
<NavigationBar />์์ <ConfirmModal /> ์ปดํฌ๋ํธ๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ฌ์ ํ์ํ๊ณ ์ํ๊ณ ๋ฅผ isModalOpened๋ผ๋ ์ํ๋ก ๊ฒฐ์ ํ๋๋ฐ,
๊ทธ ์ํ ๊ด๋ฆฌ๋ฅผ <NavigationBar />์ปดํฌ๋ํธ ์์์ useState()ํ
์ ์ฌ์ฉํด ์ง์ ๊ด๋ฆฌํ์ง ์๊ณ ,
useConfirmModal()์ด๋ผ๋ ์ปค์คํ
ํ
์ผ๋ก ๋ถ๋ฆฌ์์ผ ๊ด๋ฆฌํ๋ค.
import { useState } from 'react';
const useConfirmModal = (initialValue = false) => {
const [isModalOpened, setIsModalOpened] = useState(initialValue);
const toggleIsModalOpened = () => {
setIsModalOpened(!isModalOpened);
};
return {
toggleIsModalOpened,
isModalOpened,
};
};
export default useConfirmModal;
์ด๋ ๊ฒ ์ปค์คํ ํ ์ผ๋ก ๋ถ๋ฆฌํด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉด ๋๊ฐ์ ๊ธฐ๋ฅ์ ํ์๋ก ํ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉํ ์ ์์ด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋ค๋ ์ฅ์ ์ธ์๋ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์๋ค.
- ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ก ์ธํ ๊ฐ๋ ์ฑ ํฅ์
- ๋ก์ง ์บก์ํ๋ก ์ธํ ํ ์คํธ ์ฉ์ด์ฑ ์ฆ๊ฐ
renderHook
ํ ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ API.
๋ฆฌ์กํธ ํ
์ ๊ฒ์ฆํ๊ธฐ ์ํด์๋ ํ
์ ํธ์ถํ๊ณ ๋ ํ์ ํ
์ด ๋ฐํํ๋ isMOdalOpened์ ๊ฐ์ ์ํ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ณ๊ฒฝ๋๋์ง ํ์ธํด์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ๋ฆฌ์กํธ ๊ท์น์ ๋ฆฌ์กํธ ํ
(๋ฆฌ์กํธ ์์ฒด ํ
, ์ปค์คํ
ํ
๋ชจ๋)์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์์์๋ง ํธ์ถํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์ง๊ธ ํ
์คํธ๋ฅผ ํ๊ณ ์๋ ํ์ผ์ธ useCOnfirmModal.spec.jsx๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ์๋๊ธฐ๋๋ฌธ์ (์ผ๋ฐ jsํ์ผ) ํ
์ ํธ์ถํ ์ ์์ง๋ง, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด renderHook() api๋ฅผ ์ฌ์ฉํ๋ฉด ํธ์ถํ ์ ์๋ค.
const { result, rerender } = renderHook(useConfirmModal);
// or
const { result } = renderHook(() => useConfirmModal(true));
expect(result.current.isModalOpened).toBe(false);
// or
result : ํ ์ ํธ์ถํ์ฌ ์ป์ ๊ฒฐ๊ณผ ๊ฐ. rerender : ํ ์ ์ํ๋ ์ธ์์ ํจ๊ป์๋ก ํธ์ถํ์ฌ ์ํ๋ฅผ ๊ฐฑ์ . (๊ฐ์์์๋ ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํ๊ณ ์ฌ์ฉ์ ์ํ๋ค?)
act ํจ์
์ํธ ์์ฉ(๋ ๋๋ง, ์ดํ๋ ๋ฑ)์ ํจ๊ป ๊ทธ๋ฃนํํ๊ณ ์คํํด ๋ ๋๋ง๊ณผ ์ ๋ฐ์ดํธ๊ฐ ์ค์ ์ฑ์ด ๋์ํ๋ ๊ฒ๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๋์ํจ.
- ์ฆ act๋ฅผ ์ฌ์ฉํด์ผ ํ ์คํธ ํ๊ฒฝ์ ๊ฐ์์ ๋(jsdom)์ ์ ๋๋ก ๋ฐ์๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋ค ์ ๋ฐ์ดํธ ํ๋ ์ฝ๋์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ๊ณ ์ถ์๋ ์ฌ์ฉ.
๊ทธ๋ฐ๋ฐ ์ ์ด์ ๋จ์ ํ ์คํธ(UI ์ปดํฌ๋ํธ)์์๋ actํจ์๊ฐ ์์ด ํ ์คํธ๋ฅผ ์ํํ ์ ์์์๊น? ์๋ํ๋ฉด, render ํจ์ ์์ฒด์์ ๋ด๋ถ์ ์ผ๋ก act ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ.
// ์คํจ
it('ํ
์ toggleIsModalOpened()๋ฅผ ํธ์ถํ๋ฉด isModalOpened ์ํ๊ฐ toggle๋๋ค.', () => {
const { result } = renderHook(useConfirmModal);
result.current.toggleIsModalOpened();
expect(result.current.isModalOpened).toBe(true);
});
//์ฑ๊ณต
it('ํ
์ toggleIsModalOpened()๋ฅผ ํธ์ถํ๋ฉด isModalOpened ์ํ๊ฐ toggle๋๋ค.', () => {
const { result } = renderHook(useConfirmModal);
act(() => {
result.current.toggleIsModalOpened();
});
expect(result.current.isModalOpened).toBe(true);
});
