Node.js

[NestJS] NestJS 공통 라이브러리 분리 및 테스트 코드 작성 환경 개선

ooin 2024. 5. 23. 22:07
반응형

 

인수인계 받은 코드에는 테스트 코드가 없습니다.….

그래서 수정한 기능 혹은 새로 생성한 기능에 대한 테스트코드를 작성하려고 했는데…

에러가 발생했습니다... :(

 

테스트 진행 시 모듈을 찾지 못함

 

엔티티 에서 import 한 ApiColumn 을 찾을 수 없다는 에러 내용인데, 현재 라이브러리를 사용하지 않고 단순히 common 디렉토리 아래 코드를 생성후 가져다 사용하기 때문에 테스트 코드에서는 찾을 수 없다고 하는 것 같습니다..

이를 해결하기 위해 기존 common 아래 있던 기능들을 별도의 라이브러로 구성해 에러를 해결해보려고 합니다..

 

common 라이브러리 생성

npx nest g library common

 

라이브러리 생성 후 src/c_common/decorator/api-column.decorator.ts를 lib/common/decorator로 이동

  • 수정 전 구조
/src
	/c_common
		/decorators
			- api-column.decorator.ts
  • 수정 후 구조
/lib
	/common
		/src
			/decorators
				- api-column.decorator.ts
				- index.ts	
			- common.moudle.ts
			- index.ts

 

라이브러리쪽 코드를 좀 더 자세히 살펴보면

//common.module.ts

import { Module } from '@nestjs/common';

@Module({
  providers: [],
  exports: [],
})
export class CommonModule {}

// 최 상단의 index.ts

export * from './common.module';
export * from './decorators'

// decorators 안의 index.ts 

export * from './api-column.decorator';

 

엔티티에 import 되어있던 라이브러리에서 decorator에서 import 되도록 수정

  • 수정 전
import { ApiColumn } from '../../../../c_common/decorators/api-column.decorator';
@Entity({ comment: '기사' })
export class Article extends Default {

//엔티티 컬럽들

}
  • 수정 후
import { ApiColumn } from "@app/common";

export class Article extends Default {

//엔티티 컬럽들

}

 

app module 에 Common module 추가

//app.module.ts

import {CommonModule} from "@app/common";

@Module({
  imports: [
    ...Modules
    CommonModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
	...
}

 

 

 

이후 테스트를 진행해보니 아래와 같이 매칭되는 테스트를 찾지 못함.

 

Jest에서 보고있는 디렉토리가 잘못된것으로 보여, Jest config 를 확인 후 수정

  • 수정 전
{
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": ".",
    "testRegex": ".*\\\\.spec\\\\.ts$",
    "transform": {
      "^.+\\\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "./coverage",
    "testEnvironment": "node",
    "roots": [
      "<rootDir>/src/",
      "<rootDir>/libs/"
    ],
    "moduleNameMapper": {
      "^@app/common(|/.*)$": "<rootDir>/libs/common/src/$1"
    }
  }
  • 수정 후
  "moduleFileExtensions": [
    "js",
    "json",
    "ts"
  ],
  "rootDir": ".",
  "testRegex": ".*\\\\.spec\\\\.ts$",
  "transform": {
    "^.+\\\\.(t|j)s$": "ts-jest"
  },
  "collectCoverageFrom": [
    "**/*.(t|j)s",
    "**/*.{js,jsx}",
    "!**/node_modules/**",
    "!**/vendor/**"
  ],
  "coverageDirectory": "./coverage",
  "testEnvironment": "node",
  "roots": [
    "<rootDir>/test/", // src -> test 로 변경
    "<rootDir>/libs/"
  ],
  "moduleNameMapper": {
    "^@app/common(|/.*)$": "<rootDir>/libs/common/src/$1"
  }
}

 

 

이 후 다시 테스트를 진행해보면,

반응형