Jest 설정을 추가하기위해 고군분투한 흔적을 남겨보자..
현재 진행중인 졸업프로젝트는 CRA+typescript로 설정되어있는 상태이다.
CRA 프로젝트에는 Jest가 기본적으로 설치되어있어서
yarn add jest -D
// or npm install jest --save-dev
와 같은것들은 필요가 없다 👍
// package.json
//{
// ...,
"scripts": {
...,
"test": "jest"
},
// ...
// }
// 테스트할 파일 : sum.ts
export const sum = (a: number, b: number) => {
return a + b
}
// 테스트코드 파일 : sum.test.ts
import { sum } from "./calculator"
it("add correctly", () => {
expect(add(3, 5)).toBe(8)
})
yarn test
// or npm test
Jest encountered an unexpected token
(a: number, b: number)
와 같은것들을 이해하지 못해서 발생하였다!jest는 CommonJS 모듈 시스템을 사용하기 때문에 ES6 문법으로 바꿔줄 수 있는 바벨 설정이 추가로 필요하다!
바벨에 대해 짧게 설명하자면,
ES6+ 버전 이상의 자바스크립트나 JSX, 타입스크립트 코드를 하위 버전의 자바스크립트 코드로 변환 시켜 IE나 다른 브라우저에서 동작할 수 있도록 하는 트랜스파일러다
yarn add --dev @babel/preset-env ts-jest
ts-jest
: ts로 쓰인 프로젝트를 jest를 이용해서 테스트할 수 있게하는 Jest transformerts-jest
가 아닌 @babel/preset-typescript
을 설치할 수 있는데, ts-jest
의 장점이 좀 더 많아서 (컴파일될때와 실행될때 타입이 동시에 검사됨...등등) ts-jest
를 설치하기로 하였다.//.babelrc
{
...,
"presets": [
...,
"@babel/preset-env"
,
]
}
// jest.config.js
module.exports = {
testPathIgnorePatterns: [ '<rootDir>/node_modules/'],
transform: {
'^.+\\.(js|jsx|ts|tsx)$': 'ts-jest',
},
};
transform
: 정규표현식과 일치하는 파일명인 경우에는 ts-jest
를 사용하겠다는 의미
testPathIgnorePatterns
: 해당 경로들은 test에 포함되지 않음
여기까지 해주더라도, 위의 단순한 함수 기능 테스트가 아닌
리액트 컴포넌트 테스팅 (rtl + jest 사용)의 경우 + 절대경로 설정이 되어있는경우 jest 설정파일의 추가설정이 따로 필요하다!
절대경로가 인식이 안되어서 발생하는 에러
Cannot find module ~ from ~
js-dom으로 테스트환경을 설정해주지 않아서 발생하는 에러
The error below may be caused by using the wrong test environment, see https://jestjs.io/docs/configuration#testenvironment-string.
Consider using the "jsdom" test environment.
ReferenceError: document is not defined
testEnvironment
Default: "node"
The test environment that will be used for testing. The default environment in Jest is a Node.js environment. If you are building a web app, you can use a browser-like environment through jsdom instead.
tsconfig
파일이 아래와 같이 되어있는 경우, // tsconfig.json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@App/*": ["src/*"],
"lib/*": ["common/*"]
}
}
}
moduleNameMapper
를 추가해주면 된다.// jest.config.js
module.exports = {
// [...]
moduleNameMapper: {
'^@App/(.*)$': '<rootDir>/src/$1',
'^lib/(.*)$': '<rootDir>/common/$1',
},
}
// jest.config.js
module.exports = {
testPathIgnorePatterns: [ '<rootDir>/node_modules/'],
transform: {
'^.+\\.(js|jsx|ts|tsx)$': 'ts-jest',
},
moduleNameMapper: {
// jest가 절대경로를 인식하기 위함
'^src/(.*)$': '<rootDir>/src/$1',
},
// 테스트환경을 jsdom으로 설정함.
testEnvironment: 'jsdom',
};
위와 같이 설정을 마친후, 간단한 테스트 코드를 작성했는데 또 에러가 발생하였다.🤯
나는 jest의 Matcher중 하나인toBeInTheDocument
함수를 사용했는데,
TypeError: expect(...).toBeInTheDocument is not a function
라는 에러를 마주했고
jest.setup.js
파일을 생성하여 다음과 같이 코드를 추가해준후
// jest.setup.js
import '@testing-library/jest-dom'
jest 설정파일에도 위에 생성한 setup파일을 추가해주니 해결되었다.
// jest.config.js
module.exports = {
...,
"setupFilesAfterEnv": [
"<rootDir>/jest.setup.js"
]
}
이제 정말 제대로 작동되는것을 확인해볼 수 있다!
jest 설정 끗 -! 🎀
https://blog.pumpkin-raccoon.com/81
https://stackoverflow.com/questions/62951078/got-typeerror-expect-tobeinthedocument-is-not-a-function-even-after-proper
https://kulshekhar.github.io/ts-jest/docs/getting-started/paths-mapping/