NavigationBar ์ปดํฌ๋ํธ
NavigationBar์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ๋ค์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค
- ๋ก๊ณ ํด๋ฆญ์ ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋
- ๋น๋ก๊ทธ์ธ์
- ๋ก๊ทธ์ธ ๋ฒํผ ๋ ธ์ถ, ํด๋ฆญ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋
- ๋ก๊ทธ์ธ์
- ์ฅ๋ฐ๊ตฌ๋ ๋ฒํผ
- ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ์ํ์๊ฐ ๋ํ๋จ
- ํด๋ฆญ์ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ก ์ด๋
- ๋ก๊ทธ์์ ๋ฒํผ
- ํด๋ฆญ์ "๋ก๊ทธ์์ ํ์๊ฒ ์ต๋๊น?" ๋ชจ๋ฌ ๋ ธ์ถ
- ๋ชจ๋ฌ์ ํ์ธ ๋ฒํผ ํด๋ฆญ์ ๋ก๊ทธ์์
- ์ฅ๋ฐ๊ตฌ๋ ๋ฒํผ
์ด์ ํตํฉ ํ ์คํธ๋ฅผ ์ด๋ป๊ฒ ์์ฑํ๋ฉด ์ข์๊น? ์์ ์์๋ ์ด๋ ๊ฒ ๊ตฌ์ฑํ๋ค.
- (it)๋ก๊ณ ํด๋ฆญ์ "/" ๊ฒฝ๋ก๋ก ์ด๋(
navigate๋ฅผ ํธ์ถํ๋ค). - (describe)๋ก๊ทธ์ธ์ด ๋ ๊ฒฝ์ฐ
- (it)์ฅ๋ฐ๊ตฌ๋ ๋ฒํผ, ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ์ํ ์, ๋ก๊ทธ์์ ๋ฒํผ(์ฌ์ฉ์ ์ด๋ฆ)์ด ๋ ๋๋ง ๋๋ค
- (it)์ฅ๋ฐ๊ตฌ๋ ๋ฒํผ ํด๋ฆญ์ "/cart" ๊ฒฝ๋ก๋ก ์ด๋ํ๋ค(
navigate๋ฅผ ํธ์ถํ๋ค). - (describe)๋ก๊ทธ์์ ๋ฒํผ
- (it)๋ชจ๋ฌ์ด "๋ก๊ทธ์์ ํ์๊ฒ ์ต๋๊น?" ๋ฌธ๊ตฌ์ ํจ๊ป ๋ ๋๋ง ๋๋ค.
- (it)ํ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ก๊ทธ์์์ด ๋๋ฉฐ ๋ชจ๋ฌ์ด ์ฌ๋ผ์ง๋ค
- (it)์ทจ์ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ชจ๋ฌ์ด ์ฌ๋ผ์ง๋ค.
- (describe)๋น๋ก๊ทธ์ธ ๊ฒฝ์ฐ
- (it)๋ก๊ทธ์ธ ๋ฒํผ ๋ ๋๋ง, ํด๋ฆญ์ ํ์ฌ "/login"๊ฒฝ๋ก๋ก
pathname๊ณผ ํจ๊ปnavigateํจ์๋ฅผ ํธ์ถ
- (it)๋ก๊ทธ์ธ ๋ฒํผ ๋ ๋๋ง, ํด๋ฆญ์ ํ์ฌ "/login"๊ฒฝ๋ก๋ก
msw์ useํจ์
๋ก๊ทธ์ธ์ด ๋ ๊ฒฝ์ฐ ํ
์คํธ๋ฅผ ํ๊ธฐ ์ํด์๋ ๋ก๊ทธ์ธ์ด ๋ ์ํ๋ฅผ ๋ชจํนํด์ผ ํ๋ค.
๊ทธ๋ฌ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ๋ ๊ฒฝ์ฐ์ describe ์์ ์
์
beforeEach๋ก ํด์ค์ผํ๋ค.
๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ์ด๋ฌํ ์ฌ์ฉ์ ์ ๋ณด๋ ์คํ ์ด์์ ๊ฐ์ ธ์ค๋๊ฒ์ด ์๋๋ผ api ํธ์ถ์ ํตํด ๊ฐ์ ธ์จ๋ค๋ ๊ฒ์ด๋ค.
NavigationBar์ปดํฌ๋ํธ์์๋ useProfileํ
(๋ด๋ถ์ ์ผ๋ก ๋ฆฌ์กํธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉ)์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ setUserData๋ก ์คํ ์ด์ ์ ์ฅํ๋ค.
//NavigationBar.jsx
const { data, remove } = useProfile({
config: {
onSuccess: profile => {
setUserData(profile);
initCart(profile.id);
},
enabled: !!isLogin,
},
});
๊ทธ๋์ ์ด api๋ฅผ ๋ชจํนํด์ผํ๋๋ฐ, ์ ๋ฒ ์๊ฐ๋ถํฐ ์ฐ๋ฆฌ๋ api ๋ชจํน์ msw๋ก ํด์๋ค. ๊ทธ๋์ msw ์ฝ๋(handlers.js) ๋ก ๊ฐ๋ด์ผ ํ๋๋ฐ, useProfileํ
์ด ์์ฒญ์ ๋ณด๋ด๋ ์ฃผ์์ ํด๋นํ๋ ์ฝ๋๋ฅผ ์ฐพ์๋ณด๋ฉด ์ด๋ ๋ค.
rest.get(`${API_DOMAIN}${apiRoutes.profile}`, (req, res, ctx) => {
return res(ctx.status(200), ctx.json(null));
}),
๋ก๊ทธ์ธ์ด ๋์ด์์ง ์๋๊ฒ ๊ธฐ๋ณธ๊ฐ์ ์ํ๋ผ๊ณ ๋ณด๋๊ฒ ์ ์ ํ๋๊น ์์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์๋ ์๋ค. ๊ทธ๋์ ์ฌ์ฉํ๋๊ฒ msw์ use ํจ์๋ค.
server ์ธ์คํด์ค
ํ
์คํธ ์
์
ํ์ผ์ ๊ฐ๋ณด๋ฉด server ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋๊ฒ์ ๋ณผ ์ ์๋ค.
//setupTests.js
import { setupServer } from 'msw/node';
import '@testing-library/jest-dom';
import { handlers } from '@/__mocks__/handlers';
/* msw */
export const server = setupServer(...handlers);
beforeAll(() => {
server.listen();
});
afterEach(() => {
server.resetHandlers();
vi.clearAllMocks();
});
afterAll(() => {
vi.resetAllMocks();
server.close();
});
//...
์ด ์ธ์คํด์ค๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํด์ผ ๊ธฐ์กด์ ๋ชจํน๋ api์ ์๋ต์ ์ ์์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
useํจ์ ์์ฑ
describe('๋ก๊ทธ์ธ์ด ๋ ๊ฒฝ์ฐ', () => {
const userId = 10;
beforeEach(() => {
server.use(
rest.get('/user', (_, res, ctx) => {
return res(
ctx.status(200),
ctx.json({
email: 'maria@mail.com',
id: userId,
name: 'Maria',
password: '12345',
}),
);
}),
);
mockUseUserStore({ isLogin: true });
useํจ์๋ฅผ ์ฌ์ฉํ๋ฉด handlers.js์ ์์ฑ๋ ๊ธฐ๋ณธ ์ค์ ๋๋ก๊ฐ ์๋๋ผ useํจ์ ๋ด๋ถ์ ์์ฑํ ์๋ต์ ๊ธฐ์ค์ผ๋ก ํ
์คํธ๊ฐ ์งํ๋ ์ ์๋ค. ์ด ํ๊ฒฝ์์ useProfileํ
์ ์์ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
useํจ์ ๊ฒฐ๊ณผ ์ด๊ธฐํ
useํจ์๋ก ๋ณ๊ฒฝํ ์๋ฒ์ api ์๋ต๋ ๋ค๋ฅธ ๋ชจํน๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ธฐํ๋ฅผ ํด์ฃผ์ด์ผ ํ๋๋ฐ, ์ด๋์ ํด์ฃผ๋๊ฒ์ผ๊น?
์์ setupTests.js๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋์์ ๋ชจ๋ ํ
์คํธ๊ฐ ์๋ฃ๋ ํ์ ์คํํ๋ ํฐ์ด๋ค์ด์ผ๋ก ์์ฑ๋์ด ์๋๊ฒ์ ๋ณผ ์ ์๋ค.
//setupTests.js
afterEach(() => {
server.resetHandlers();
vi.clearAllMocks();
});
within ํจ์
๋ก๊ทธ์์ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ชจ๋ฌ์ด ๋ํ๋๋์ง์ ๋ํ ํ ์คํธ์ฝ๋๋ค.
it('๋ชจ๋ฌ์ด ๋ ๋๋ง๋๋ฉฐ, ๋ชจ๋ฌ ๋ด์ "๋ก๊ทธ์์ ํ์๊ฒ ์ต๋๊น?" ํ
์คํธ๊ฐ ๋ ๋๋ง๋๋ค.', () => {
const dialog = screen.getByRole('dialog');
expect(screen.getByRole('dialog')).toBeInTheDocument();
expect(
within(dialog).getByText('๋ก๊ทธ์์ ํ์๊ฒ ์ต๋๊น?'),
).toBeInTheDocument();
});
์ฌ๊ธฐ ์ฝ๋๋ฅผ ๋ณด๋ฉด screen.getByText ๋์ within(dialog).getByText๋ฅผ ์ฐ๊ณ ์๋ค.
within ํจ์๋ฅผ ์ฐ๋ฉด getBy์ ์กฐํ ๋ฒ์๋ฅผ ํด๋น ์์๋ก ์ ํํ ์ ์๋ค. ์ฌ๊ธฐ์๋ ์ฌ์ค "๋ก๊ทธ์์ ํ์๊ฒ ์ต๋๊น?"๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ํ์ด์ง ์ ์ฒด์ ํ๋๋ฐ์ ์์ด์ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง, ๊ฐ๋ น ProductList ์ปดํฌ๋ํธ๋ฅผ ํ
์คํธํ ๋ ์ฌ๋ฌ ProductCard๊ฐ ํ๋ฉด์์ ์กด์ฌํ๊ณ ๊ฑฐ๊ธฐ์ ํน์ ์ํ์ "์ฅ๋ฐ๊ตฌ๋" ๋ฒํผ์ ์ฐพ์ผ๋ ค๊ณ ํ๋ค๋ฉด ํ๋ฉด์์ ์ฌ๋ฌ "์ฅ๋ฐ๊ตฌ๋" ๋ฒํผ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ screen ๋์ within์ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๋ค.
