설치
터미널에서 다음 명령어로 jest를 설치한다.
npm install --save-dev jest
설정
package.json 에서 스크립트의 test를 jest로 수정해준다.
다음 예시처럼 폴더계층을 만들어준다.
├── package-lock.json
├── package.json
├── src
│ ├── index.js
│ └── tests
│ └── test.js
테스트 작성
test.js에 테스트 코드를 짠다.
describe('Jest 사용 예시', () => {
test('숫자 0은 false이다', () => {
expect(Boolean(0)).toBe(false);
});
// 프리미티브 타입 검사의 경우 toEqual()을 사용해도 큰 문제는 없습니다.
test('숫자 0은 false와 같다(equal)', () => {
expect(Boolean(0)).toEqual(false);
});
test('객체 비교 시, toEqual() 매처는 얕은 비교를 수행한다. (속성,속성값 고려x)', () => {
expect({ text: undefined }).toEqual({});
});
test('Jest에서는 not을 사용해 매처를 부정할 수 있다.', () => {
expect('hi').not.toEqual('bye');
});
});
describe는 테스트 그룹을 나타내고
테스트는 test()로 작성한다.
실행방법
터미널에서 다음과 같이 입력한다.
npm test
혹은
npx jest
위 명령어를 입력하면 jest가 인식하는 모든 테스트 파일을 찾아 실행한다.
혹은
npx jest tests
tests 디렉토리에 있는 테스트만 실행한다.
toBe vs toEqual
다음 코드에서 두 비교함수의 차이점을 나타낸다.
test('toBe는 obj가 같은 객체를 가리키고 있는지 확인한다', () => {
const obj = {};
expect(obj).toBe(obj); // true
});
test('객체의 내용이 같더라도 서로 다른 메모리에 있는 객체이기 때문에 toBe를 쓰면 false가 나온다.', () => {
expect({ name: 'John' }).toBe({ name: 'John' }); // false
});
test('대신에 객체의 내용이 같은지를 확인하려면 toEqual을 써야 한다', () => {
const obj = {};
expect({ name: 'John' }).toEqual({ name: 'John' }); // true
});
모듈 import 에러
Jest encountered an unexpected token
Jest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.
Out of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.
By default "node_modules" folder is ignored by transformers.
Here's what you can do:
• If you are trying to use ECMAScript Modules, see <https://jestjs.io/docs/ecmascript-modules> for how to enable it.
• If you are trying to use TypeScript, see <https://jestjs.io/docs/getting-started#using-typescript>
• To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
• If you need a custom transformation specify a "transform" option in your config.
• If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.
You'll find more details and examples of these config options in the docs:
<https://jestjs.io/docs/configuration>
For information about custom transformations, see:
<https://jestjs.io/docs/code-transformation>
Details:
/home/kdh/daehoon/potatonet/link-crawler/src/tests/test.js:1
({"Object.":function(module,exports,require,__dirname,__filename,jest){import { formatURL } from '../Link_Crawler.js';
^^^^^^
SyntaxError: Cannot use import statement outside a module
외부 모듈을 import 하려고 하자 문제가 발생한다.
Jest transformIgnorePatterns 설정
- Jest는 Node.js 환경에서 동작하기 때문에 CommonJS 방식으로 모듈을 사용한다.
- Jest는 바벨 같은 트랜스파일러를 통해 ECMAScript 모듈을 CommponJS 문법에 맞도록 변경 후 사용해야 한다.
해결 방법
필요한 패키지를 설치한다.
yarn add --dev babel-jest @babel/core @babel/preset-env
프로젝트 루트 디렉토리에 jest.config.js를 만들고, jest.config.js를 다음과 같이 작성한다.
module.exports = {
moduleFileExtensions: ["js", "json", "jsx", "ts", "tsx", "json"],
transform: {
'^.+\\\\.(js|jsx)?$': 'babel-jest'
},
testEnvironment: 'node',
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/$1'
},
testMatch: [
'<rootDir>/**/*.test.(js|jsx|ts|tsx)', '<rootDir>/(tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx))'
],
transformIgnorePatterns: ['<rootDir>/node_modules/']
};
같은 위치에 babel.config.js를 만들고, 다음과 같이 작성한다.
module.exports = {
"presets": ["@babel/preset-env"]
}
이렇게 jest에서도 import를 사용할 수 있게 되었다.
즉, ES module이 아닌 CommonJS module 시스템을 사용해야 한다.
reference
'♾️Language & Framework > 🎈Javascript' 카테고리의 다른 글
[Puppeteer / Trouble Shooting] puppeteer가 좀비 프로세스를 종료하지 않는 문제 (0) | 2024.01.17 |
---|---|
[Javascript] - Winston을 사용하여 node.js에서 로깅하는 법 (0) | 2024.01.17 |