Jest 설치와 기본 사용 방법 (수정중)
Overview
섹션 제목: “Overview”Jest는 JavaScript와 TypeScript 프로젝트에서 가장 많이 쓰이는 테스트 도구 중 하나다. 이 문서에서는 Node.js 프로젝트 기준으로 Jest 설치, 기본 단위 테스트, mocking 방법을 한 번에 정리한다.
How to
섹션 제목: “How to”1. Jest 설치
섹션 제목: “1. Jest 설치”TypeScript 프로젝트라면 보통 아래 패키지를 함께 설치한다.
npm i --save-dev jest @types/jest ts-jest# 또는yarn add -D jest @types/jest ts-jest필요한 패키지는 역할에 따라 나눠서 볼 수 있다.
jest: 테스트 러너@types/jest: TypeScript 타입 정의ts-jest: TypeScript 테스트 변환기
2. transform 설정
섹션 제목: “2. transform 설정”TypeScript 파일을 테스트하려면 Jest가 .ts, .js 파일을 어떻게 변환할지 알아야 한다.
"transform": { "^.+\\.(t|j)s$": "ts-jest"}설정이 맞지 않으면 아래처럼 Jest encountered an unexpected token 에러가 날 수 있다.
3. 기본 단위 테스트 작성
섹션 제목: “3. 기본 단위 테스트 작성”비동기 함수 테스트에서는 await와 rejects / resolves를 함께 쓰는 패턴이 가장 흔하다.
4. mocking 적용
섹션 제목: “4. mocking 적용”mocking은 크게 두 방향으로 자주 쓴다.
jest.spyOn으로 메서드를 직접 감시하거나 대체- 테스트용 클래스를 만들어 provider를 override
Example
섹션 제목: “Example”Error 검사
섹션 제목: “Error 검사”it('error: no exist id', async () => { const id = 'test_id';
await expect(fetchUser(id)).rejects.toThrowError( new NoUserException('no exist id'), );});객체 비교
섹션 제목: “객체 비교”it('Object: equal', async () => { const id = 'test_id'; const user = await fetchUser(id);
await expect(user).toStrictEqual({ id: 'strict-user-id' });});jest.spyOn으로 private 메서드 mocking
섹션 제목: “jest.spyOn으로 private 메서드 mocking”const getUser = jest .spyOn(user as any, 'getUser') .mockImplementation(async () => { return { id: 'mock-user' }; });
expect(getUser).toHaveBeenCalled();expect(getUser).toHaveBeenCalledTimes(1);overrideProvider로 class mocking
섹션 제목: “overrideProvider로 class mocking”class MockUserService extends UserService { async fetchUser(id: string): Promise<User> { if (!id) { throw new Error('no exist id'); }
return { id: 'mock-user-id', }; }}
const module: TestingModule = await Test.createTestingModule({ providers: [MockUserService], imports: [UserModule],}) .overrideProvider(UserService) .useClass(MockUserService) .compile();Notes
섹션 제목: “Notes”1) unexpected token 에러가 나면 transform부터 확인한다
섹션 제목: “1) unexpected token 에러가 나면 transform부터 확인한다”- TypeScript 프로젝트라면
ts-jest설정이 빠져 있을 수 있다. - Jest가
.ts파일을 어떻게 해석할지 모르면 구문 에러처럼 보이는 문제가 날 수 있다.
2) 비동기 테스트는 await expect(...).rejects/resolves 패턴이 기본이다
섹션 제목: “2) 비동기 테스트는 await expect(...).rejects/resolves 패턴이 기본이다”- 비동기 함수 테스트에서
await를 빼면 의도와 다르게 통과하거나 실패할 수 있다.
3) mocking 방식은 목적에 따라 고른다
섹션 제목: “3) mocking 방식은 목적에 따라 고른다”- 특정 메서드 하나만 바꾸고 싶으면
jest.spyOn - 테스트 전체에서 provider 동작을 바꾸고 싶으면
overrideProvider
4) 같이 확인할 것
섹션 제목: “4) 같이 확인할 것”transform설정- 테스트 대상이 비동기 함수인지
- 비교 대상이 Error인지 객체인지
- provider override가 필요한 구조인지