본문 바로가기
게임서버-스파르타코딩NodeJs_7기/CH5 트렐로

Jest 테스트 트러블슈팅

by GREEN나무 2025. 3. 20.
728x90

 

1. Jest 설치 및 실행 방법

설치

npm init -y
npm install --save-dev jest
npm install --save-dev jest @types/jest ts-jest
npm install bcrypt
npm install --save-dev @types/bcrypt

테스트 실행 스크립트 추가 (package.json 수정)

{
  "scripts": {
    "test": "jest"
  }
}

테스트 실행 방법

  • 전체 테스트 실행
    npm run test
    
  • 특정 테스트 파일 실행
    npx jest user.service.spec.ts
    

2. 단위 테스트 작성 규칙

  1. 독립적(Independent)이어야 한다
    • 다른 테스트에 의존하지 않고 개별적으로 실행 가능해야 함.
  2. 격리(Isolation)되어야 한다
    • Ajax, LocalStorage, UI Event 등의 의존성을 테스트 더블(Dummy, Stub, Fake, Spy, Mock)으로 대체.
  3. given, when, then 단계로 코드 작성
    • given: 테스트 조건 설정
    • when: 테스트 실행
    • then: 기대하는 결과 검증

3. Mocking 관련 문제 해결

(1) mockResolvedValue(value) vs mockImplementation(fn)

  • mockResolvedValue(value)는 비동기 함수에서 자동으로 값을 반환하도록 설정
  • mockImplementation(fn)은 동작을 완전히 커스텀 가능

예제

❌ 잘못된 코드 (타입 에러 발생)

jest.spyOn(bcrypt, 'compare').mockResolvedValue(false);

✅ 올바른 코드 (TypeScript가 Promise<boolean> 타입을 올바르게 추론)

jest.spyOn(bcrypt, 'compare').mockImplementation(async () => false);

(2) Cannot redefine property 에러 해결

같은 jest.spyOn()을 여러 번 호출하면 발생하는 문제

해결 방법

  1. beforeEach()에서 한 번만 spyOn() 설정하고, 테스트마다 재사용
  2. afterEach()에서 모든 mock을 원래 상태로 복구

예제

describe('UserService', () => {
  let hashSpy: jest.SpyInstance;
  let compareSpy: jest.SpyInstance;

  beforeEach(async () => {
    hashSpy = jest.spyOn(bcrypt, 'hash').mockImplementation(async () => 'hashedPassword');
    compareSpy = jest.spyOn(bcrypt, 'compare').mockImplementation(async () => true);
  });

  afterEach(() => {
    jest.restoreAllMocks(); // 모든 mock을 원래 상태로 복구
  });

  // 테스트 코드...
});

4. Jest 설정 파일 충돌 문제 (Multiple configurations found)

Jest 설정 파일이 여러 개 존재하면 실행이 중단될 수 있음.

오류 메시지 예시

● Multiple configurations found:
* `jest` key in package.json
* `jest.config.js`

해결 방법

해결 1: 하나만 유지하고 삭제

  • jest.config.js를 유지하려면 → package.json의 "jest" 속성 제거
  • package.json의 "jest" 속성을 유지하려면 → jest.config.js 파일 삭제

해결 2: 실행 시 명시적으로 설정 파일 지정

# jest.config.js 사용
npm run test -- --config=jest.config.js

# package.json의 jest 속성 사용
npm run test -- --config=package.json