일반적으로 Unit Test에서는 Database나 네트워크 연결을 하지 않고, 보통 mock을 이용하여 test를 진행한다.
하지만, 실제 DB와 연결하여 테스트를 해보라는 팀장님의 의견으로 테스트용 DB를 생성하고 해당 DB와 연결하여 테스트를 진행해 보았다.
우선, 테스팅 모듈에 database와 연결해줄 필요가 있기에, 기존에 만들어 두었던 database.module을 import 하여 주었다.
database.module.ts의 코드는 아래와 같다.
@Module({
imports: [
TypeOrmModule.forRootAsync({
imports: [
ConfigModule.forRoot({
envFilePath:
process.env.NODE_ENV === 'test'
? '.env.test'
: process.env.NODE_ENV === 'prod'
? '.env.prod'
: process.env.NODE_ENV === 'dev'
? '.env.dev'
: '.env.local',
}),
],
inject: [ConfigService],
useFactory: (configService: ConfigService) => ({
type: 'mysql',
host: configService.get('DATABASE_HOST'),
port: configService.get('DATABASE_PORT'),
username: configService.get('DATABASE_USER'),
password: configService.get('DATABASE_PASSWORD'),
database: configService.get('DATABASE_NAME'),
entities: [join(__dirname, '/../**/*.entity.js')],
migrations: ['dist/migration/**/*.js'],
cli: {
migrationsDir: 'src/migration',
},
keepConnectionAlive: true,
timezone: 'Z',
logging: ['error'],
}),
}),
],
})
export class DatabaseModule {}
하지만, 회사에서 실제 사용하는 DB를 사용하면 여러 문제가 생길 수 있기 때문에, test용 DB를 사용할 필요가 있었다.
1. .env.test파일 생성
그렇기에, .env.test라는 파일을 새로 만들고, 그곳에 테스트용 DB에 대한 정보를 적어 주었다.
2. envFilePath지정
database 모듈에서 envFilePath에 test일 경우, .env.test파일에서 환경변수를 읽어오도록 만들었다.
3. database 연결 유지하기 - keepConnectionAlive: true
2번까지 진행 한 뒤, 연결이 제대로 됐는지 테스트를 돌려봤다.
아래와 같은 에러가 발생하는 모습을 볼 수 있었다.
AlreadyHasActiveConnectionError: Cannot create a new connection named "default", because connection with such name already exist and it now has an active connection session.
이미 default라는 이름으로 database connection이 생성 되어 있는데, 새로운 connection을 만들려고 하니 생긴 문제였다.
찾아보니,새로운 connection이 생기면 기존의 연결을 종료하고, 새로운 것으로 대체할수 있는 keepConnectionAlive: true 이라는 옵션이 있었다. (참고로 해당 옵션의 default값은 false이다. )
이렇게 연결을 하고, 테스트를 돌려보면 it works like a charm!
[참고 - entity 관련 error]
Error: RepositoryNotFoundError: No repository for [Enitity] was found. Looks like this entity is not registered in current "default" connection?
혹시나, 위와 같은 에러가 발생한다면, database.module의 entity속성을 체크해보자.
나의 경우, entity파일들이 전부 ts였는데, entities:[join(__dirname,'../**/*.entity.js')] 로 되어있었기에 에러가 발생하여,
entities:[join(__dirname,'../**/*.entity.ts')] 로 바꾸어 주니 정상 작동하였다.
'테스트코드' 카테고리의 다른 글
[Solved] Jest did not exit one second after the test run has completed. (0) | 2022.08.04 |
---|---|
UnitTest - createQueryBuilder (chained method) mocking하기 (0) | 2022.04.07 |
Unit Test에서 독립성 유지하기(feat. NestJS with Jest) (0) | 2022.03.28 |
NestJS에서 테스트코드 작성(feat. Jest, @nestjs/testing) (1) | 2022.03.28 |