Front End/Jest
typescript 기반 react 프로젝트에 jest 적용 오류해결, recoil, router Custom Render로 해결
YJ_SW
2022. 11. 25. 09:38
728x90
test오류
typescript를 사용하는 react 프로젝트에서 test를 실행시켰을 때 아래와 같은 오류가 발생했다.
SyntaxError: /Login.tsx: Unexpected token, expected "," (10:20)
타입 선언한 부분에서 오류가 발생했다.
오류해결
root > .babelrc
바벨 파일에 "@babel/preset-typescript" 추가해주기
{
"env": {
"test": {
"presets": [
"@babel/preset-env",
[
"@babel/preset-react",
{
"runtime": "automatic"
}
],
"@babel/preset-typescript"
],
"plugins": ["@babel/plugin-transform-runtime"]
}
}
}
recoil, router Test 오류
그리고 프로젝트에서 recoil과 react router를 사용해주었는데 이와 관련해서도 test 오류가 발생했다.
[Error: useRoutes() may be used only in the context of a <Router> component.]
이 에러는 현재 실제 코드는 <RecoilRoot>와 <BrowserRouter>로 감싸주었지만, 테스트 부분에는 감싸주지 않기 때문에 recoil과 router를 사용할 때 에러가 나고 있습니다.
오류해결
아래와 같이 오류 해결할 수 있다.
import { render, screen } from '@testing-library/react'
import App from './App'
import {BrowserRouter} from 'react-router-dom'
import {RecoilRoot} from "recoil";
describe('App', () => {
it('renders App', () => {
render(<RecoilRoot><BrowserRouter><App/></BrowserRouter></RecoilRoot>)
expect(screen.getByText('')).toBeInTheDocument()
})
})
하지만 다른 데스트들도 recoil과 router가 필요하기 때문에 모든 test 파일에 매번 render에 <RecoilRoot><BrowserRouter><Component/></BrowserRouter></RecoilRoot> 감싸주는 것은 번거롭고 코드의 중복이 많아진다.
Custom Render
Custom Render 를 만들어서 해결하자
test-util.tsx 파일을 생성하고
import {ReactElement} from "react";
import {render as reactRender} from "@testing-library/react";
import {RecoilRoot} from "recoil";
import {BrowserRouter} from "react-router-dom";
const render = (ui: ReactElement, {...options} = {}) =>
reactRender(ui, {
wrapper: ({children}) => (
<RecoilRoot>
<BrowserRouter>{children}</BrowserRouter>
</RecoilRoot>
),
...options,
});
export * from "@testing-library/react";
// render 메소드 이외에도 testingLibrary에서 제공해주는 모든 것을 다시 export 해주기
export {render};
// 원래 tlr에서 제공하는 render 메소드를 customRender로 override 해주기
기존에 testing-library/react에서 import 해주었던 것을 test-utils에서 import 해주어 사용하면 된다.
728x90