NestJS/jest (테스트 코드)

[NestJS] Jest 단위 테스트 - TestingModule

Yuco 2023. 6. 12. 22:57

 

1. 모듈(Module)

 

자바스크립트에서 모듈이란 어떤 코드를 다른 JS 파일에서 불러오기 편하도록 하나의 파일에 모아둔 것 입니다. 

프로젝트가 커질수록 모든 JS 코드를 하나의 파일에 두기 어렵기 때문에, 자연스럽게 코드가 여러 JS 코드로 나눠지게 됩니다. (기능에 따라 모듈을 나눌 경우, 유지보수 및 코드 이해가 편하기 때문에 모듈을 나눠 작성할 것을 권장합니다.)

 

- NestJS에서 모듈은 대부분 다른 모듈에서 아래와 같이 import 키워드를 통해 불러내어 사용하게 됩니다.

 

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

 

2. TestingModule

 

NestJS에서 제공하는 @nestjs/testion 패키지를 사용하면 테스트에 사용되는 종속성만 선언해서 모듈을 만들고 해당 모듈로 Service와 Repository를 가져올 수 있습니다.

 

 import { Test, TestingModule } from '@nestjs/testing'  

 describe('UsersService', () => {  
     let usersService: UsersService. 
     let userRepository: MockRepository<User>
     beforeEach(async () => {
         const module: TestingModule = await Test.createTestingModule({   
         providers: [

           UsersService


            { provide: getRepositoryToken(User), useValue: MockRepository() },
             ],
         }).compile()

        usersService = module.get<UsersService>(UsersService)
        userRepository = module.get(getRepositoryToken(User))
})

 

위 코드와 같이 NestJS는 Test,createTestingModule() 함수를 사용해서 테스트 모듈을 설정할 수 있습니다. 이 함수에는 테스트 환경을 구성하기 위해 필요한 모듈과 서비스를 등록합니다. 이를 통해 각 테스트 케이스에서 필요한 모듈, 서비스, 레포지토리에 쉽게 접근할 수 있습니다. 

 

- providers 배열에 등록된 Service와 Repository를 제공하며, providers 배열로 TestingModule에서 사용되는 모든 Service와 Repository의 의존성을 설정합니다. 이에 등록된 Service와 Repository는 테스트 동안 주입될 수 있습니다.

- .complie()을 활용해 Testing 모듈을 컴파일 함으로써, TestingModule은 설정된 모듈과 서비스를 컴파일하여 테스트가 가능한 모듈로 만듭니다. 

 

 usersService module.get<UsersService>(UsersService)
 userRepository module.get(getRepositoryToken(User))

 

module.get<UsersService>(UsersService) 를 사용하여 UsersService의 인스턴스를 가져올 수 있습니다. 이렇게 작성 함으로서 usersService 변수가 UsersService의 인스턴스를 참조하게 됩니다. 

 

 jest.spyOn(usersService, 'findUserByUserId').mockResolvedValue(user)

 

위와 같은 방식으로 usersService에 정의되어 있는 함수를 참조할 수 있습니다.

 

- spyOn() 함수는 Jest에서 제공하는 spy 기능으로, 주어진 객체의 메서드를 spy 하여 호출 및 반환 값을 추적하거나 원하는 대로 재정의 할 수 있게 하는 기능을 제공합니다. 

 

결과적으로 위의 코드는 userService 객체의 findUserByUserId()라는 메서드를 스파이 하고 추적합니다. 그리고 mockResolvedValue(user)을 통해 해당 메서드가 호출될 때 항상 user 값을 반환하도록 설정합니다. 

이렇게 함으로써 테스트 코드에서 usersService.findUserByUserId를 호출할 때 실제로는 스파이 된 메서드가 호출되고 설정된 반환 값(user)이 반환됩니다. 이를 통해 테스트 중에 원하는 동작을 가로채거나 확인할 수 있습니다. 

 

 

 

처음으로 NestJS의 테스트 코드를 작성해보며, 적은 글 입니다. 혹시 잘못된 부분이 있다면 댓글로 친절하게 알려주세요. 😀