jest에서 src를 인식하지 못하는 이유

ClassBinu·2024년 4월 26일

F-lab

목록 보기
16/65

문제 상황

import { UsersService } from 'src/users/users.service';

위와 같은 코드는 jest에서 인식하지 못한다.

이렇게 피드백을 받았다.

헉. 아니요.😥

원인 찾기

jest는 절대 경로를 어떻게 해석할지 몰라서 그러는 거였음.

    Cannot find module 'src/users/users.service' from 'auth/test/auth.service.spec.ts'

      11 | import { TokenStrategy } from '../strategies/token.strategy';
      12 | import { User } from 'src/users/entities/user.entity';
    > 13 | import { UsersService } from 'src/users/users.service';
         | ^
      14 |
      15 | describe('AuthService', () => {
      16 |   let service: AuthService;

      at Resolver._throwModNotFoundError (../node_modules/jest-resolve/build/resolver.js:427:11)
      at Object.<anonymous> (auth/test/auth.service.spec.ts:13:1)

에러 메시지를 보면 '모듈을 찾을 수 없음'이다.
이유를 찾아 본다.

현재 프로젝트 폴더의 tsconfig.jsonbaseUrl: "./"와 같이 설정되어 있다.
이건 ts컴파일러가 상대 경로 없이 임포트된 모듈 주소의 기본 상태 경로를 지정하는 설정이다.

즉, 현재는 src/로 시작하는 주소는 ./src/로 해석된다.
여기서 ./tsconfig.json이 위치하는,
프로젝트 최상위 폴더이다.

하지만 jest는 그렇지 않다.
jest는 tsconfig.json 공유하지 않기 때문에 어디서부터 모듈을 찾아야 할지를 모른다.

그래서 jest 설정으로 moduleNameMapper 옵션을 걸어줘야 한다. 이를 통해 절대 경로를 매핑해야 한다.

해결 방법

우선 package.json의 jest의 rootDir를 stc에서 ./로 바꿔서 tsconfig.json과 일치 시킴.

1. 상대 경로로 바꾸기

src가 아니라, 현재 파일을 기준으로 ../../src/와 같이 바꾸면 된다.

2. jest 설정 바꾸기

jest.config.js 설정을 다음과 같이 바꾼다.

module.exports = {
  moduleNameMapper: {
    '^src/(.*)$': '<rootDir>/src/$1'  // `<rootDir>`는 Jest가 실행되는 디렉토리를 가리킵니다.
  },
  // 나머지 설정...
};

이렇게 했을 때 src/로 시작하는 모든 모듈 경로를 프로젝트 루트 디렉터리 아래의 src 디렉터리와 연결한다.

0개의 댓글