💡 통합 테스트에서는
✔️ 여러 모듈이 조합되었을 때 비즈니스 로직을 검증
✔️ 비즈니스 로직 기준으로 여러 컴포넌트들 간의 상호 작용을 한 번에 검증할 수 있음작성해야 할 통합 테스트로는..
상태나 데이터를 관리하는 특정 컴포넌트를 기준으로 하위 컴포넌트가 제대로 렌더링 되는지 검증하는 테스트
데이터를 관리하는 로직이 산재 → 통합 테스트 작성이 어려움
앱의 상태를 어디서 어떻게 관리하고 변경할지 구조적인 설계가 중요함
✔️ 특정 상태를 기준으로 동작하는 컴포넌트 조합
✔️ API와 함께 상호작용 하는 컴포넌트 조합
⇒ 단순 UI 렌더링 및 간단한 로직을 실행하는 컴포넌트까지 한번에 효율적으로 검증 가능
결국 중요한 건
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { render } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';
import { Toaster } from 'react-hot-toast';
import { MemoryRouter } from 'react-router-dom';
// https://tanstack.com/query/v4/docs/react/guides/testing
const queryClient = new QueryClient({
defaultOptions: {
queries: {
// ✅ turns retries off
// 기존 탠스택 쿼리에는 요청 실패시 최대 3번의 추가 요청을 하게 되는데
// 테스트 시에는 실패시 괜히 테스트 시간이 길어져 원하는 에러 메시지를 못 볼 수 있다.
retry: false,
},
},
logger: {
log: console.log,
warn: console.warn,
// ✅ no more errors on the console for tests
error: process.env.NODE_ENV === 'test' ? () => {} : console.error,
},
});
export default async (component, options = {}) => {
const { routerProps } = options;
const user = userEvent.setup();
return {
user,
...render(
<QueryClientProvider client={queryClient}>
<MemoryRouter {...routerProps}>{component}</MemoryRouter>
<Toaster />
</QueryClientProvider>,
),
};
};
// handlers.js
// API의 응답 모킹을 위해 Request Handler 라는 것을 정의해서 사용한다.
import { rest } from 'msw';
import response from '@/__mocks__/response';
import { apiRoutes } from '@/apiRoutes';
const API_DOMAIN = 'http://localhost:3000';
export const handlers = [
...[
apiRoutes.users,
apiRoutes.product,
apiRoutes.categories,
apiRoutes.couponList,
].map(path =>
.
.
.
// setupTest.js
// handlers.js에서 작성된 응답 모킹을 테스트 서버와 연결한다.
// setup, teardown을 통해 테스트 서버를 상황에 맞게 작동시킨다.
import { setupServer } from 'msw/node';
import '@testing-library/jest-dom';
import { handlers } from '@/__mocks__/handlers';
/* msw */
export const server = setupServer(...handlers);
// msw 설정 적용
// -> 테스트 환경에서 API 호출은 msw의 핸들러에 설정한 응답으로 모킹
beforeAll(() => {
// 서버 구동
server.listen();
});
afterEach(() => {
server.resetHandlers();
vi.clearAllMocks();
});
afterAll(() => {
vi.resetAllMocks();
server.close();
});