본문 바로가기
내일배움 과제/트렐로

jest 테스트 추가하기

by GREEN나무 2025. 2. 5.
728x90

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 파일의 scripttest 부분을 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)을 사용하면 TypeScriptPromise<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.jsonjest 속성

이 중 하나만 남기고 삭제하세요.

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.jsonjest 속성을 사용하려면:

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