NestJS 메모리 데이터베이스로 테스트하기

이준영·2022년 6월 4일
0

깃허브 코드 링크

UserModule

@Module({
    ...
    imports: [TypeOrmModule.forFeature([UserRepository])],
    providers: [UserService, UserQueryService],
  	...
})
export class UserModule {}

User 테스트 코드

describe('UserModule', () => {
    let module: TestingModule
    let userService: UserService
    let userRepository: UserRepository

    beforeEach(async () => {
        module = await Test.createTestingModule({
            imports: [
                TypeOrmModule.forRoot({
                    type: 'sqlite',
                    database: ':memory:',
                    entities: ['경로 또는 엔티티 객체를 입력합니다.'],
                    synchronize: true,
                }),
                UserModule,
            ],
        }).compile()

        userService = module.get<UserService>(UserService)
        // UserService는 UserRepository에 의존하고 있다 깃허브 참조
        userRepository = module.get<UserRepository>(UserRepository)
    })
  
   afterEach(async () => {
        await module.close()
    })
})

테스트 모듈을 만들떄 UserModuleTypeOrmModule를 imports에 주입합니다.

이렇게 테스트 모듈을 생성하면 UserService가 의존성을 가지고 있는 UserRepository는 sqlite memory db와 연결되어 실제 쿼리가 수행됩니다.

이와같은 테스트 방식은 빠르고 단순하게 DB를 설치하지 않고 쿼리까지 테스트 할 수 있는 장점이 있습니다.
하지만 이 방식에는 제약이 존재합니다 DB별로 지원하는 Column Type이 달라 엔티티 컬럼에 sqlite가 지원하지 않는 Column Type을 사용한다면 이 방식은 사용 할 수 없습니다.

profile
NodeJS 백엔드 개발자

0개의 댓글