jest 테스트 추가하기
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 파일의 script의 test 부분을 jest로 변경
// package.json
{ "scripts": {
"test": "jest"
}}
실행
테스트 실행 명령어
npm run test user.service
또는 Jest를 직접 실행하여 특정 테스트 파일만 실행
npx jest user.service.spec.ts
_______________________________________________
단위테스트 작성하기 전 규칙을 정하자.
단위테스트를 작성할 때는 다음과 같은 규칙을 지켜야한다.
독립적(Independent)이어야한다. 어떤 테스트도 다른 테스트에 의존하지 않아야한다.
격리(Isolation)되어야한다. Ajax, LocalStorage, UI Event 등 테스트 대상이 의존하는 것을 다른 것으로 대체한다. 이렇게 대체하는 것을 테스트 더블(Dummy, Stub, Fake, Spy, Mock)이라고 한다.
given, when, then 단계에 따라 테스트 코드를 작성한다.
mockResolvedValue(value)는 비동기 함수(Promise 반환 함수)에서 value를 자동으로 반환하도록 만든다.
mockImplementation(fn)은 함수의 동작을 완전히 커스텀할 수 있도록 한다.
에러 : "message": "'false' 형식의 인수는 'never' 형식의 매개 변수에 할당될 수 없습니다.",
// jest.spyOn(bcrypt, 'compare').mockResolvedValue(false); // 안됨
// mockResolvedValue(false) 대신 mockImplementation(async () => false)을 사용하면 TypeScript가 Promise<boolean> 타입을 올바르게 추론한다.
jest.spyOn(bcrypt, 'compare').mockImplementation(async () => false); // 가능
현재 jest.spyOn(bcrypt, 'hash') 또는 jest.spyOn(bcrypt, 'compare') 를 여러 번 호출하면서 Cannot redefine property 에러가 발생했다.
beforeEach에서 각각의 테스트마다 있던 jest.spyOn(bcrypt, 'hash'), jest.spyOn(bcrypt, 'compare')를 한번만 설정하고
afterEach에서 모든 mock을 원래 상태로 복구한다.
describe('UserService', () => {
...
let hashSpy: jest.SpyInstance;
let compareSpy: jest.SpyInstance;
beforeEach(async () => {
// 특정 테스트마다 따로 spyOn()을 호출하는 것이 아니라, beforeEach()에서 한 번만 설정하고 테스트마다 재사용하는 방법
hashSpy = jest.spyOn(bcrypt, 'hash').mockImplementation(async () =>'hashedPassword');
compareSpy = jest.spyOn(bcrypt, 'compare').mockImplementation(async () =>true);
...
});
afterEach(() => {
jest.restoreAllMocks(); // 모든 mock을 원래 상태로 복구
});
________________________
Jest 테스트 실행 시 설정 파일이 여러 개 감지되어 실행이 중단된 문제
● Multiple configurations found:
* `jest` key in V:/Sparta/Team/trello/sineUp/25 * `jest` key in V:/Sparta/Team/trello/sineUp/250204/package.json
Implicit config resolution does not allow multiple configuration files.
Either remove unused config files or select one explicitly with `--config`.
Configuration Documentation:
https://jestjs.io/docs/configuration
해결1
현재 프로젝트에는 두 개의 Jest 설정 파일이 존재합니다:
jest.config.js, package.json의 jest 속성
이 중 하나만 남기고 삭제하세요.
jest.config.js를 유지하려면 → package.json의 "jest" 속성을 제거
package.json의 "jest"를 유지하려면 → jest.config.js 파일을 삭제
해결2: 삭제하지 않고 Jest 실행 시 명시적으로 설정 파일 지정
실행할 때 --config 옵션을 사용하세요.
jest.config.js를 사용하려면:
npm run test -- --config=jest.config.js
package.json의 jest 속성을 사용하려면:
npm run test -- --config=package.json
_________________________________________
https://inpa.tistory.com/entry/JEST-%F0%9F%93%9A-%EB%AA%A8%ED%82%B9-mocking-jestfn-jestspyOn
https://news0516.tistory.com/109
'내일배움 과제 > 트렐로' 카테고리의 다른 글
nestjs jwt 인증, 비번 해싱 및 검증 , 로그아웃, 마이그레이션 (0) | 2025.02.04 |
---|---|
user CRUD API 구현하기 (0) | 2025.01.24 |
2차회의 (0) | 2025.01.23 |
1차회의 - 250122 (0) | 2025.01.22 |