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. 단위 테스트 작성 규칙
- 독립적(Independent)이어야 한다
- 다른 테스트에 의존하지 않고 개별적으로 실행 가능해야 함.
- 격리(Isolation)되어야 한다
- Ajax, LocalStorage, UI Event 등의 의존성을 테스트 더블(Dummy, Stub, Fake, Spy, Mock)으로 대체.
- 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()을 여러 번 호출하면 발생하는 문제
해결 방법
- beforeEach()에서 한 번만 spyOn() 설정하고, 테스트마다 재사용
- 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
'게임서버-스파르타코딩NodeJs_7기 > CH5 트렐로' 카테고리의 다른 글
트러블슈팅 - 토큰 (0) | 2025.03.13 |
---|---|
jest 테스트 추가하기 (0) | 2025.02.05 |
nestjs jwt 인증, 비번 해싱 및 검증 , 로그아웃, 마이그레이션 (0) | 2025.02.04 |
user CRUD API 구현하기 (0) | 2025.01.24 |
2차회의 (0) | 2025.01.23 |