콘텐츠로 이동

Jest 설치와 기본 사용 방법 (수정중)

등록일

수정일

Jest는 JavaScript와 TypeScript 프로젝트에서 가장 많이 쓰이는 테스트 도구 중 하나다. 이 문서에서는 Node.js 프로젝트 기준으로 Jest 설치, 기본 단위 테스트, mocking 방법을 한 번에 정리한다.

TypeScript 프로젝트라면 보통 아래 패키지를 함께 설치한다.

Terminal window
npm i --save-dev jest @types/jest ts-jest
# 또는
yarn add -D jest @types/jest ts-jest

필요한 패키지는 역할에 따라 나눠서 볼 수 있다.

  • jest: 테스트 러너
  • @types/jest: TypeScript 타입 정의
  • ts-jest: TypeScript 테스트 변환기

TypeScript 파일을 테스트하려면 Jest가 .ts, .js 파일을 어떻게 변환할지 알아야 한다.

"transform": {
"^.+\\.(t|j)s$": "ts-jest"
}

설정이 맞지 않으면 아래처럼 Jest encountered an unexpected token 에러가 날 수 있다.

비동기 함수 테스트에서는 awaitrejects / resolves를 함께 쓰는 패턴이 가장 흔하다.

mocking은 크게 두 방향으로 자주 쓴다.

  • jest.spyOn으로 메서드를 직접 감시하거나 대체
  • 테스트용 클래스를 만들어 provider를 override
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);
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();

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
  • transform 설정
  • 테스트 대상이 비동기 함수인지
  • 비교 대상이 Error인지 객체인지
  • provider override가 필요한 구조인지