@Module({
...
imports: [TypeOrmModule.forFeature([UserRepository])],
providers: [UserService, UserQueryService],
...
})
export class UserModule {}
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()
})
})
테스트 모듈을 만들떄 UserModule과 TypeOrmModule를 imports에 주입합니다.
이렇게 테스트 모듈을 생성하면 UserService가 의존성을 가지고 있는 UserRepository는 sqlite memory db와 연결되어 실제 쿼리가 수행됩니다.
이와같은 테스트 방식은 빠르고 단순하게 DB를 설치하지 않고 쿼리까지 테스트 할 수 있는 장점이 있습니다.
하지만 이 방식에는 제약이 존재합니다 DB별로 지원하는 Column Type이 달라 엔티티 컬럼에 sqlite가 지원하지 않는 Column Type을 사용한다면 이 방식은 사용 할 수 없습니다.