게시물 업데이트
2021/02/09
: RTL을 활용한 테스트 (+ Axios Mockup 테스트)2021/05/05
: Axios Mockup 테스트 추가 포스팅
실습 Repository :https://github.com/LeeHyungi0622/react_testing_library_mock_axios_request_practice_repo
React Testing Library 설치
1 | $ npm install --save-dev @testing-library/react |
(1) react-testing-library에서 지원하는 render()function을 이용해서 테스트하고자 하는 component의 rendering 테스트하기
1 | import { render } from "@testing-library/react"; |
(2) rendering한 component의 요소에 data-testid
를 지정해서 해당요소를 검사할 수 있다.
1 | import '@testing-library/jest-dom/extend-expect'; |
(3) 각 테스트 단계가 끝나면 테스트 상태를 초기화 시키기 위해서 afterEach(cleanup)
를 사용한다. (cleanup은 react-testing-library에서 지원한다)
1 | import { cleanup } from '@testing-library/react'; |
(4) component에 전달할 props를 직접 작성한 뒤에 주입해서 테스트할 수 있다.
1 | it('fetches and displays data', async () => { |
(5) 방법1) nodemodules를 mocking - Axios를 통한 데이터 처리를 테스트할때 실제 HTTP를 통한 데이터 취득은 이루어지지 않는다. 그 이유는 실제 서버로부터 데이터를 취득하면 시간도 상대적으로 오래 걸리는 경우도 있기 때문이다.
따라서 Axios를 통한 데이터 취득을 할때, 실제 서버로부터 취득하는 데이터를 mockup해서 테스트를 진행한다.
- Step1) src 폴더 아래에 __mocks__ 폴더를 만들고, axios module의 mockup을 위해
axios.js
파일을 생성한다.
axios.js
1 | export default { |
이렇게 mocks 폴더 내부에서 mockup axios 파일을 만들어주면, 테스트 파일내에서 axios module을 호출할때, 실제 axios module이 아닌, __mocks__
폴더내에서 mockup한 axios module을 호출하게 된다.
테스트 파일에서 이 mockup한 axios module을 override해서 값을 새롭게 정의한 다음에 새롭게 customize된 값을 가진 axios module을 이용해서 테스트를 진행할 수 있다.
1 | import axiosMock from 'axios'; |
sample code
출처 : https://www.leighhalliday.com/mocking-axios-in-jest-testing-async-functions
1 | import mockAxios from 'axios'; |
(6) 비동기 처리부분을 테스트하는 경우, 해당 부분이 화면에 rendering되는 것을 기다려줘야 한다. (waitForElement()
은 deprecated되었기 때문에 waitFor()
로 대체 사용한다)
1 | // 실제 데이터가 넘어갔을때 화면에 보여지는 tag 부분에 "resolved" id를 삽입하였다. |
(7) mockup axios function이 제대로 호출되고 있는지 확인한다.
1 | // axiosMock.get mockup function이 한 번 호출되었는지 체크 |
(8) TypeError: _axios.default.create is not a function
에러가 발생
axios.create로 axios 인스턴스를 생성해서 사용하는 경우에는 axios-mock-adapter
라이브러리를 사용해서 mocking을 하도록 하자.
(9) 방법2) axios-mock-adpater를 이용한 axios mocking
앞서 실습해 본 방법말고 이번에는 axios-mock-adapter를 이용해서 axios mocking을 해보려고 한다. mocking을 하게 되면 실제로 요청은 발생하지 않지만 마치 발생한 것처럼 작동하게
https://github.com/ctimmerm/axios-mock-adapter
실제 프로젝트를 진행하면서 작성한 코드를 첨부한다.
MockAdapter 인스턴스를 생성할때의 첫 번째 인자로는 axios 라이브러리를 넣어주고, 두번째 인자로는 가짜로 200ms delay 시간을 설정해준다.
Api.test.js
1 | import React from 'react'; |