testing-library
리액트에서도 권장하고 있는 테스팅 라이브러리. create-react-app
으로 생성한 프로젝트는 기본적으로 포함하고 있다.
axios-mock-adapter
axios
요청을 mock, 즉 가짜로 한다.
npm install axios-mock-adapter --save-dev
사용
기본 사용법new MockAdaptor(axios)
를 통해 axios의 요청을 mocking한다.
실제 서버까지 요청이 전달되지 않고, mocking한 요청과 동일한 요청이 있다면 .reply(~)
로 설정한 가짜 응답 값이 돌아온다.
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
const mock = new MockAdapter(axios, { delayResponse: 200 });
mock.onGet('http://~').reply(200, {
code: 200,
message: "success"
});
apiClient
는 axios 인스턴스다.
import React from 'react';
import apiClient from '../api';
import MockAdapter from 'axios-mock-adapter';
import { fireEvent, screen, render, waitFor } from '@testing-library/react';
import LoginForm from '../components/LoginForm';
로그인 테스트
현재 로그인에 성공하면 /user
로 이동하도록 구현해두었기 때문에 해당 처리가 잘 되는지 검증한다.
fireEvent
는 렌더된 컴포넌트의 엘리먼트에 이벤트를 발생시킨다. 코드로 어느정도 유추 가능..
describe('<LoginForm/>', () => {
//...
it('로그인에 성공하면 /user로 이동한다.', async () => {
const mock = new MockAdapter(apiClient);
mock.onPost('/auth/login').reply(200, {
accessToken: '1a6f28a25c43408ba8e970def1448303',
});
customRender(<LoginForm />);
const idInput = screen.getByPlaceholderText('ID');
const pwdInput = screen.getByPlaceholderText('PASSWORD');
const loginBtn = screen.getByRole('button');
fireEvent.change(idInput, { target: { value: 'jrue' } });
fireEvent.change(pwdInput, { target: { value: '1234' } });
fireEvent.click(loginBtn);
await waitFor(() => expect(window.location.pathname).toEqual('/user'));
});
}
MockAdapter를 사용하지 않으면?
실제 서버로 요청된다.
만약 api 요청 도메인을 환경변수로 관리하고 있다면, 테스트 하기 전에 .env.test
파일을 꼭 작성하자.(작성 후 재시작 필수)
'STUDY > React' 카테고리의 다른 글
React | 파일 다운로드 (0) | 2021.11.17 |
---|---|
React | 반응형 테이블을 만들어보자.. (8) | 2021.11.12 |
React | API 요청을 분리해보기.. (0) | 2021.07.21 |
React | custom hook (useAsync 훅 만들기) (0) | 2021.07.19 |
React | 서브라우트 Nested Route (0) | 2021.06.30 |